7

次のような「plainlinks」というファイルがあります。

13080. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94092-2012.gz
13081. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94094-2012.gz
13082. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94096-2012.gz
13083. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94097-2012.gz
13084. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94098-2012.gz
13085. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94644-2012.gz
13086. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94645-2012.gz
13087. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94995-2012.gz
13088. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-94996-2012.gz
13089. ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/999999-96404-2012.gz

次のような出力を生成する必要があります。

999999-94092
999999-94094
999999-94096
999999-94097
999999-94098
999999-94644
999999-94645
999999-94995
999999-94996
999999-96404
4

5 に答える 5

11

使用sed:

sed -E 's/.*\/(.*)-.*/\1/' plainlinks

出力:

999999-94092
999999-94094
999999-94096
999999-94097
999999-94098
999999-94644
999999-94645
999999-94995
999999-94996
999999-96404

変更をファイルに保存するには、次の-iオプションを使用します。

sed -Ei 's/.*\/(.*)-.*/\1/' plainlinks

または、新しいファイルに保存してからリダイレクトするには:

sed -E 's/.*\/(.*)-.*/\1/' plainlinks > newfile.txt

説明:

s/    # subsitution
.*    # match anything
\/    # upto the last forward-slash (escaped to not confused a sed)
(.*)  # anything after the last forward-slash (captured in brackets)
-     # upto a hypen
.*    # anything else left on line
/     # end match; start replace 
\1    # the value captured in the first (only) set of brackets
/     # end
于 2012-11-14T19:44:41.193 に答える
7

楽しみのためだけに。

awk -F\/ '{print substr($7,0,12)}' plainlinks

またはgrep

grep -Eo '[0-9]{6}-[0-9]{5}' plainlinks

于 2012-11-14T20:02:13.320 に答える
4

説明したようにフォーマットが一貫していると仮定すると、次の方法で実行できますawk

awk 'BEGIN{FS="[/-]"; OFS="-"} {print $7, $8}' plainlinks > output_file

出力:

999999-94092
999999-94094
999999-94096
999999-94097
999999-94098
999999-94644
999999-94645
999999-94995
999999-94996
999999-96404

説明:

  • awk入力ファイルを一度に 1 行ずつ読み取り、各行を「フィールド」に分割します
  • 'BEGIN{FS="[/-]"; OFS="-"}入力行で使用される区切り文字が または のいずれ/-である必要があることを指定します。また、出力が-
  • {print $7, $8}'各行の 7 番目と 8 番目のフィールドを出力するように awk に指示します9999999xxxx
  • plainlinks入力ファイルの名前が入る場所です
  • > output_file出力を次の名前のファイルにリダイレクトしますoutput_file
于 2012-11-14T19:46:26.610 に答える
4

シェルのパラメータ展開だけで:

while IFS= read -r line; do
    tmp=${line##*noaa/}
    echo ${tmp%-????.gz}
done < plainlinks
于 2012-11-14T19:54:26.940 に答える
1

フォーマットが同じであれば、sedやawkは必要ありません。

cat your_file | cut -d "/" -f 7- | cut -d "-" -f 1,2
于 2012-11-15T01:36:47.047 に答える