.csvファイルの特定の行の最後の単語をgrepします。

.csvファイルの特定の行の最後の単語をgrepします。

次のテキストファイルがあります。

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}'

関連情報