使用不同分隔符组合多个awk命令

使用不同分隔符组合多个awk命令,awk,Awk,我连续运行两个awk命令来分解基于多个分隔符的字符串。我想知道它们是否可以合并成一个命令 输入数据(jot-w“一些字符串,这是数字”10): 这只是示例数据,但我希望能够首先基于逗号分割字符串,然后从第二部分提取数字(第四个单词)。实际上,字符串第一部分中的空格数可能会有所不同,即以下为有效输入: some string, this is number 1 some string with more spaces, this is number 2 以下命令工作正常: $ jot -w "s

我连续运行两个
awk
命令来分解基于多个分隔符的字符串。我想知道它们是否可以合并成一个命令

输入数据(
jot-w“一些字符串,这是数字”10
):

这只是示例数据,但我希望能够首先基于逗号分割字符串,然后从第二部分提取数字(第四个单词)。实际上,字符串第一部分中的空格数可能会有所不同,即以下为有效输入:

some string, this is number 1
some string with more spaces, this is number 2
以下命令工作正常:

$ jot -w "some string, this is number " 10 | awk -F ',' '{print $2}' | awk -F ' ' '{print $4}'
1
2
3
4
5
6
7
8
9
10

有没有简单的方法将这两个命令组合成一个命令

您可以使用NF轻松打印最后一列

jot -w "some string, this is number " 10 |awk '{print $NF}'
或者按照您的想法,将两个awk合并为一个awk

jot -w "some string, this is number " 10  |awk '{l=split($2,a,OFS);print a[l]}' FS="," 
split()
函数将允许您执行以下操作:

awk '{split($0,a,",");split(a[2],b," ");print b[4];}'

要解决您描述的问题,请执行以下操作:

$ cat file
some string, this is number 1
some string with more spaces, this is number 2

$ awk -F, '{n=split($NF,a,/ /); print a[n]}' file
1
2
或者如果你喜欢高尔夫:

$ awk -F, '{print a[split($NF,a,/ /)]}' file
1
2
但显然,对于您指定的输入,这将起作用:

$ awk '{print $NF}' file
1
2

与其他各种解决方案一样。

awk
使用正则表达式作为分隔符,但如果逗号前面的部分可以有不同数量的字段,则可能需要运行两个
awk
s。也许你可以使用
cut
来表示“更简单”的部分?@jasper
cut
绝对是一个选项,谢谢,是的,我知道
awk
可以使用正则表达式作为分隔符,但即使逗号前的空格数没有变化,也可以(在我的应用程序中)执行两个连续的awk语句比必须在第二个程序中更改字段的索引更可读。谢谢你的评论。可能是+1的重复,但可能应该明确指出,人们通常会这样写:
awk'{split($2,a,“”);print a[4]}'FS=,
并对第一个分隔符使用正常的字段拆分。既然这个答案被接受,那么我就必须给出一些建议。带有
/
的拆分函数在大多数情况下都可以,但并非总是建议更改为OFS(因为已使用FS并将其设置为其他值)。
拆分的第三个参数是一个字段分隔符,它是一个regexp,对单个空白字符进行特殊处理,
。因此,对于RE常量来说,正确的分隔符是
/…/
的重新分隔符,以保证清晰性和功能性(例如,如果使用字符串分隔符
“…”
,则需要对任何RE元字符进行双转义,以将其视为文字)。使用输出字段分隔符拆分输入仅仅是因为它碰巧被设置为您要拆分的字符(),这将是不必要的耦合和混淆。
$ awk '{print $NF}' file
1
2