awkを使用してxargsを介したパイピングを使用した文字列の列のフィルタリング

awkを使用してxargsを介したパイピングを使用した文字列の列のフィルタリング

いくつかのファイルがあります。

file1.csv
file2.csv
file3.csv

与えられたスクリプトはそれを処理し、次のファイルに書き込みます。

my.log

次の形式を取ります。(filename col2 col3):

file1.csv 1 a
file2.csv 1 a
file3.csv 1 a
file2.csv 2 b
file1.csv 2 b
file3.csv 2 b
file1.csv 3 c
file2.csv 3 c
file3.csv 3 c
file2.csv 4 d
file3.csv 4 d

col3各ファイル(最後のファイルのみ)ごとにファイルから値を取得したいと思います。my.log*.csv

次のコマンドを実行します。

ls *.csv | xargs -I@ bash -c "cat my.log | grep @ | tail -n 1 | awk '{ print $3 }'"

awkが私にすべての熱を与えることを除いて、うまくいきます。

file1.csv 3 c
file2.csv 4 d
file3.csv 4 d

列を1つだけ取得するにはどうすればよいですかcol3?たとえば、次のようになります。

c
d
d

ベストアンサー1

あなたの表現に

 "cat my.log | grep @ | tail -n 1 | awk '{ print $3 }'"

...文字列の周囲の二重引用符は、一重引用符がリテラルとして処理されることを意味します。シェルを保護しないので、$3環境変数に展開されます。実際にはシェルによって定義されていないので$3(3つの引数で呼び出すスクリプトにない限り)空の文字列になり、式はawk単に{ print }行全体を印刷します。

以下をエスケープしてこの問題を解決できます$

ls *.csv | xargs -I@ bash -c "cat my.log | grep @|tail -n 1|awk '{print \$3}'"

...または式をawk外に移動してxargs

ls *.csv | xargs -I@ bash -c "cat my.log | grep @|tail -n 1"|awk '{print $3}'

おすすめ記事