フルパスを含むファイルがあります。
/home/usr/file_name_delimited_by_underscore_123.txt
/home/usr/another_example_456.rar
拡張子なしでパスからファイル名を印刷し、その横にある最後のファイル名を印刷したいと思います_
。
出力:
file_name_delimited_by_underscore_123 123
another_example_456 456
パイプされたawkコマンドを使用して目的の出力を取得する方法を見つけました。
cat file | awk -F[/.] '{print $(NF-1)}' | awk -F_ '{print $0" "$NF}'
パイプを使わずにこれを達成する方法はありますか?
私の質問は、awkで解析されたフィールドでアクションを実行できますか?
ご協力ありがとうございます。
答え1
はい、現場では好きなように何でもできます。たとえば、
$ cat file | awk -F[/.] '{n = split($(NF-1),a,/_/); print $(NF-1)" "a[n]}'
file_name_delimited_by_underscore_123 123
another_example_456 456
もちろん、これは必要ではありません。ファイルを直接読み取るcat
ことができます。デフォルトの出力フィールド区切り文字は空白なので、結果を文字列連結ではなく別々の出力フィールドとして作成する方が慣用的です。awk
OFS
awk -F[/.] '{n = split($(NF-1),a,/_/); print $(NF-1), a[n]}' file
答え2
すべてのsedの場合:
$ sed 's:.*/\(.*_\(.*\)\)\..*:\1 \2:' file
file_name_delimited_by_underscore_123 123
another_example_456 456
答え3
あなたはそれを使用することができますsed
:
$ sed -e 's;^.*/\(.*_\)\([0-9]*\)\.[^\.]*$;\1_\2 \2;' file
file_name_delimited_by_underscore_123 123
another_example_456 456
^.*/
パスを削除します。
\(.*_\)
最後の下線まで名前をキャプチャします。
\.[^\.]*
拡張機能を削除してください。
\1\2 \2
キャプチャされたグループに置き換えられました。