awk フィールドワーク

awk フィールドワーク

フルパスを含むファイルがあります。

/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ことができます。デフォルトの出力フィールド区切り文字は空白なので、結果を文字列連結ではなく別々の出力フィールドとして作成する方が慣用的です。awkOFS

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キャプチャされたグループに置き換えられました。

関連情報