コマンドライン - 条件付きで部分文字列を保存する

コマンドライン - 条件付きで部分文字列を保存する

コマンドラインユーティリティは条件付きで部分文字列を別のファイルに保存できますか?file.txt次の行を含むファイル()があります。

1/1_ABCD4.txt:20020711
1/1_ABCD10.txt:20020731
2/2_ABCD2.txt:20071103
2/2_ABCD5.txt:20071107
3/3_ABCD1.txt:20090225
3/3_ABCD3.txt:20090230

20020711私の目標は、20020731ファイル1、ファイル、ファイル20071103として保存することですか?20071107220090225200902303

:次のコマンドを使用して目的の部分文字列を抽出できますが、そうすると参照番号が失われます。

$ grep -oP 'txt\:\K[A-Z0-9-]+' 'path/to/file.txt'

20020711
20020731
20071103
20071107
20090225
20090230

/コマンドラインを使用して、最初の数字がターゲット参照の前にある3つの別々のファイルを構築できますか?ターゲットはソーステキストファイルと同じディレクトリにあります。

  1. 文書:
20020711
20020731
  1. 文書:
20071103
20071107
  1. 文書:
20090225
20090230

ありがとうございます。

答え1

そしてawk

awk -F'[:/]' '{print $NF > $1}' file

/行を分割するには、区切り文字としてとを使用します:。最後のフィールド($NF)は印刷する内容、最初のフィールド($1)は出力ファイル名です。


テスト入力ファイルを実行した後:

$ head 1 2 3
==> 1 <==
20020711
20020731

==> 2 <==
20071103
20071107

==> 3 <==
20090225
20090230

また、データに基づいてランダムな名前のファイルに印刷するのを防ぐために、この作業の前に条件を追加することをお勧めします。これは、構造が異なる行が多いと危険です。

最初のフィールド(ファイル名)に数字のみがある場合にのみ印刷したい場合の簡単な例:

awk -F'[:/]' '$1 ~ /^[0-9]+$/ {print $NF > $1}' file

答え2

使用sed

$ sed s'~\([0-9]\)/[^:]*:\(.*\)~echo \2 >> \1~e' file.txt
$ cat 1
20020711
20020731

関連情報