基于长度的awk分隔字段

时间:2018-06-27 14:43:14

标签: awk

我有一个包含类似于以下内容的行的字段:

HEJ;DU;NORDEN;13322;90
ER;HER;NOGEN;334333;1

我想输出一个文件,其中$ 4(可以是5或6位数字)被分为两个单独的字段,具体取决于长度 如果5的分割应该是3-2,如果6的分割应该是3-3

所以输出应该是

HEJ;FRA;NORDEN;133;22;90
ER;HER;NOGEN;334;333;1

有人对如何进行分隔提出好建议吗?

我一直在玩awk和gsub,如果我只在领域上使用它会奏效,但是令人困惑的是要使其与其他领域重新结合起来,而且我还没有意识到可以将gsub函数嵌入到仅接触一列数据的表达式中?

2 个答案:

答案 0 :(得分:3)

您可以使用substr功能。

first = substr($4,1,3)
second = substr($4,4)
$4 = $first ";" $second

您不需要附加条件,因为第一部分始终为3位数字。

答案 1 :(得分:2)

编辑: 更简单的方法。

awk -F";" '{sub(/^.../,"&" OFS,$4)} 1' OFS=";"  Input_file

不检查诸如列长度为5或6之类的条件,如果您要这样做,我们也可以在上面的代码中添加。


能否请您尝试以下操作,如果有帮助,请告诉我。

awk -F";" -v s1=";" '
{
  $4=length($4)==5?substr($4,1,3) s1 substr($4,4):length($4)==6?substr($4,1,4) s1 substr($4,5):$4
}
1' OFS=";"  Input_file