我有一个像这样的文本文件:
first, second
hello, bye
one, two
good, bad
day, night
我想要一个脚本,它基于变量,使用grep
or检索给定行的最后一个单词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}'