いくつかのファイルがあります。
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}'