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

Ces*_*pez 0 grep awk shell-script

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

first, second
hello, bye
one, two
good, bad
day, night
Run Code Online (Sandbox Code Playgroud)

我想要一个脚本,它基于一个变量,使用grep或检索给定行的最后一个单词awk

例如:如果 num 是3,则输出应该是two

没有必要询问 num 的值。

Kus*_*nda 5

使用awk

$ awk -v num="$num" 'NR == num { print $NF }' data.in
Run Code Online (Sandbox Code Playgroud)

测试它:

$ num=3
$ awk -v num="$num" 'NR == num { print $NF }' data.in
two
Run Code Online (Sandbox Code Playgroud)

awk脚本逐条读取输入文件(一条记录默认为一行)。一旦它命中与num变量对应的记录,它就会打印该记录的最后一个字段(默认情况下,一个字段是一个以空格分隔的列)。

num内部变量awk脚本是awk,我们初始化到外壳变量的值变量num-v num="$num"在命令行上。

NR是当前记录号,NF是该记录中的字段数。 $NF是最后一个字段的数据。

如果您的文件严格以逗号分隔,请添加-F ','到命令行:

$ awk -v num="$num" -F ',' 'NR == num { print $NF }' data.in
Run Code Online (Sandbox Code Playgroud)

随着grep你不能选择一个特定的路线,但加上sed可以筛选出你想要的行,然后拿到最后一个逗号后的最后一位:

$ sed -n "${num}p" data.in | grep -o '[^,]*$'
Run Code Online (Sandbox Code Playgroud)

sed位将获取指定的行,而该grep位将提取该行最后一个逗号之后的所有内容。

你也可以这样做sed

$ sed -n "${num}s/^.*,\(.*\)$/\1/p" data.in
Run Code Online (Sandbox Code Playgroud)

此处,替换仅应用于编号为 的行$num,并将整行替换为最后一个逗号之后的行的内容并输出结果。使用-n命令行开关禁止所有其他输出。

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

$ sed -n "${num}s/^.*,//p" data.in
Run Code Online (Sandbox Code Playgroud)