次のテキストファイルがあります。
first, second
hello, bye
one, two
good, bad
day, night
grep
変数に基づいて、与えられた行の最後の単語を検索または使用するスクリプトが必要ですawk
。
たとえば、numがある場合、出力はでなければ3
なりませんtwo
。
numの値を尋ねる必要はありません。
答え1
使用awk
:
$ awk -v num="$num" 'NR == num { print $NF }' data.in
テストしてみてください:
$ num=3
$ awk -v num="$num" 'NR == num { print $NF }' data.in
two
スクリプトawk
はレコードごとに入力ファイルレコードを読み取ります(1つのレコードのデフォルト値は1行です)。変数に対応するレコードに達すると、num
そのレコードの最後のフィールドが印刷されます(フィールドはデフォルトでは空白で区切られた列です)。
num
スクリプト内の変数は、awk
コマンドラインからawk
シェル変数の値に初期化する変数です。num
-v num="$num"
NR
は現在のレコード番号で、NF
レコードのフィールド数です。 $NF
最後のフィールドのデータです。
ファイルが厳密にカンマで区切られている場合は、-F ','
コマンドラインに以下を追加します。
$ awk -v num="$num" -F ',' 'NR == num { print $NF }' data.in
grep
特定の行を選択することはできませんが、目的の行をsed
フィルタリングしてから、最後のコンマの後の最後のビットを取得できます。
$ sed -n "${num}p" data.in | grep -o '[^,]*$'
このsed
ビットは指定された行を取得し、その行のgrep
最後のコンマ以降のすべての内容を抽出します。
sed
次のようにすることもできます。
$ sed -n "${num}s/^.*,\(.*\)$/\1/p" data.in
ここでは、置換は番号付きの行にのみ適用され$num
、行全体を最後のコンマの後の行の内容に置き換えて結果を出力します。他のすべての出力は-n
コマンドラインスイッチを介して抑制されます。
または、置換を使用して行sed
の最後のコンマまですべての内容を削除します。
$ sed -n "${num}s/^.*,//p" data.in
答え2
awkでは、NRは行番号、NFは列番号なので、$ NFは最後の列です。 FSは入力レコード区切り文字で、', '
引用符付きのカンマなしでCSVに十分です。
awk -v FS=', ' 'NR==3{print $NF}'