コマンドラインユーティリティは条件付きで部分文字列を別のファイルに保存できますか?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
として保存することですか?20071107
2
20090225
20090230
3
:
次のコマンドを使用して目的の部分文字列を抽出できますが、そうすると参照番号が失われます。
$ grep -oP 'txt\:\K[A-Z0-9-]+' 'path/to/file.txt'
20020711
20020731
20071103
20071107
20090225
20090230
/
コマンドラインを使用して、最初の数字がターゲット参照の前にある3つの別々のファイルを構築できますか?ターゲットはソーステキストファイルと同じディレクトリにあります。
- 文書:
20020711
20020731
- 文書:
20071103
20071107
- 文書:
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