FORループからawkに変数を渡して特定の単語を取得します。

FORループからawkに変数を渡して特定の単語を取得します。

テーブルの一部の単語をCSV形式のTXTファイルとして印刷しようとしています。

{...some code...}
number_lines=$(awk 'END { print NR }' Table1.txt
if [$number_lines -gt 5]
then
    for ((i=5; i<$number_lines; i++))
    do
       word=$(awk 'FNR==$i {print $2}' Table1.txt)
       echo $word
       printf "$variable1\t$variable2\t$variable3\t$word\n" >> Table2.csv
    done
fi

私はi $ 2行の単語を得ることができると思いましたが、FNR = = 5 {print $ 2}を使用して欲しいものを得ることができましたが、Table1.txtにいくつかの単語があるかどうかわからないので、何かが必要です。 from 行 5 から始まり (前の行は必要ないので) Table1.txt の行 -1 の終わりに移動します。私の貧しいコードが誰かを怒らせないことを願っています。私はこれを緊急にしなければならなかったし、以前はbashで何もしたことがなかったので申し訳ありません。

ベストアンサー1

-v オプションを使用すると、シェル変数を awk 変数として非表示にできます。

awkコマンドは次のとおりです。

awk -v Seq="$i" 'FNR==Seq {print $2}' Table1.txt

その修正が提案されたら、10行すべてを単一のawkプログラムに置き換える方が速く、よりきれいになります。これにより、Table1に含まれるすべての行を読み取る必要がなくなります。 awkは行の計算とデータの読み取りに非常に堪能です。

テストされていませんが、「一部のコード」の後のすべての内容を次のように置き換えます。

awk -v Vars="${variable1}\t${variable2}\t${variable3}\t" \
    'FNR >= 5 { printf ("%s\n%s%s\n", $2, Vars, $2); }' \
    Table1.txt > Table2.csv

おすすめ記事