捕获第 n 个字段 bash
Capture nth field bash
我在文件 test.txt 中有以下格式的数据。
abc,123,mno,xyz,1234
mno,123,abc,rpt,pqr,2345
xyz,456,uyt,rtp,rto,
我想捕获我能够使用
实现的第三个字段
var=`awk -F, '{print }' test.txt | sed "s/^[ \t]*//"`
我 运行 遇到第 3 个字段可以是“mno”或“abc,rpt”的问题。
如果我使用上述逻辑,我得到的输出为
mno
abc
uyt
但我想要输出为
mno
abc,rpt
uyt,rtp
任何建议。
此致
您可以使用
awk -F, '{s=(NF==6?",":); print s}'
也就是说,如果有6个字段,则连接第三个和第四个,否则只得到第三个字段值。
查看 online demo:
#!/bin/bash
s='abc,123,mno,xyz,1234
mno,123,abc,rpt,pqr,2345
xyz,456,uyt,rtp,rto,'
awk -F, '{s=(NF==6?",":); print s}' <<< "$s"
输出:
mno
abc,rpt
uyt,rtp
你不需要将输出保存到一个变量中然后打印它(这里不需要),我们可以简单地在awk
本身的print
函数中使用三元运算符,如下所示:
awk -F, '{print (NF==6?",":)}' Input_file
解释: 简单的解释就是,将字段分隔符设置为 ,
并使用 print
语句awk
这里,如果 NF
(当前行中的字段数)是 6
,则检查条件,然后打印第 3 和第 4 个字段,用 ,
分隔,否则只打印第 3 个字段。
我在文件 test.txt 中有以下格式的数据。
abc,123,mno,xyz,1234
mno,123,abc,rpt,pqr,2345
xyz,456,uyt,rtp,rto,
我想捕获我能够使用
实现的第三个字段var=`awk -F, '{print }' test.txt | sed "s/^[ \t]*//"`
我 运行 遇到第 3 个字段可以是“mno”或“abc,rpt”的问题。
如果我使用上述逻辑,我得到的输出为
mno
abc
uyt
但我想要输出为
mno
abc,rpt
uyt,rtp
任何建议。
此致
您可以使用
awk -F, '{s=(NF==6?",":); print s}'
也就是说,如果有6个字段,则连接第三个和第四个,否则只得到第三个字段值。
查看 online demo:
#!/bin/bash
s='abc,123,mno,xyz,1234
mno,123,abc,rpt,pqr,2345
xyz,456,uyt,rtp,rto,'
awk -F, '{s=(NF==6?",":); print s}' <<< "$s"
输出:
mno
abc,rpt
uyt,rtp
你不需要将输出保存到一个变量中然后打印它(这里不需要),我们可以简单地在awk
本身的print
函数中使用三元运算符,如下所示:
awk -F, '{print (NF==6?",":)}' Input_file
解释: 简单的解释就是,将字段分隔符设置为 ,
并使用 print
语句awk
这里,如果 NF
(当前行中的字段数)是 6
,则检查条件,然后打印第 3 和第 4 个字段,用 ,
分隔,否则只打印第 3 个字段。