捕获第 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 个字段。