grep 给定行 .csv 文件的最后一个单词

grep 给定行 .csv 文件的最后一个单词

我有一个像这样的文本文件:

first, second
hello, bye
one, two
good, bad
day, night

我想要一个脚本,它基于变量,使用grepor检索给定行的最后一个单词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脚本逐条记录地读取输入文件(一条记录默认为一行)。一旦它命中与变量对应的记录num,它就会打印该记录的最后一个字段(默认情况下,字段是一个以空格分隔的列)。

num脚本内的变量是awk我们在命令行上awk初始化为 shell 变量值的变量。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命令行开关禁止。

或者,使用替换 insed来简单地删除该行到最后一个逗号的所有内容:

$ sed -n "${num}s/^.*,//p" data.in

答案2

在awk中,NR是行号,NF是列数,所以$NF是最后一列。 FS 是输入记录分隔符,', '对于不带引号的逗号的 CSV 来说应该足够了。

awk -v FS=', ' 'NR==3{print $NF}'

相关内容