在awk中分隔符后,打印相同的列作为新的线切割

时间:2018-02-14 12:28:43

标签: awk delimiter

我的文件包含以下内容:

1 18997 19003 ABCP@CC;8CYUS|ABCP@CC;8C|ABCP@CC;8C|XXYG;UY|UOO98,|ABCP@CC;8CYUS
2 87737 93837 AASC

所以,有些行的第4列有分隔符,有些没有。

我想要的是,每当我看到"|"时剪切,并将前3列作为新行追加:

1 18997 19003 ABCP@CC;8CYUS
1 18997 19003 ABCP@CC;8C
1 18997 19003 ABCP@CC;8C
1 18997 19003 XXYG;UY
1 18997 19003 UOO98,
1 18997 19003 ABCP@CC;8CYUS
2 87737 93837 AASC

然后我将应用uniq并删除重复项。 我试过这样做:

awk '{split($0,a,"|"); print a[1],a[2],a[3],a[4]}'  但是它只会在同一行中拆分第4列,并且不会将其附加到新行。

如何获得预期的输出?

2 个答案:

答案 0 :(得分:2)

您必须为提取的数组中的每个项目打印一次。当然,只拆分第四个字段。

awk '{ n = split($4, a, "|"); for (i=1; i<=n; ++i) print $1, $2, $3, a[i] }' file

如果你想确保输出是唯一的,那么Awk也可以做到这一点。

awk '{ n = split($4, a, "|");
    for (i=1; i<=n; ++i) {
        x = $1 OFS $2 OFS $3 OFS a[i]
        if (!seen[x]++) print x } }' file

答案 1 :(得分:1)

使用awk

awk '{ s= $1 FS $2 FS $3; gsub(/\|/,RS s" ") }1' infile

OR

awk -F'[ |]' '{for(i=4; i<=NF; i++)print $1,$2,$3,$i}' infile

<强> 输入:

$ cat infile
1 18997 19003 ABCP@CC;8CYUS|ABCP@CC;8C|ABCP@CC;8C|XXYG;UY|UOO98,|ABCP@CC;8CYUS
2 87737 93837 AASC

<强> 输出:

$ awk '{ s= $1 FS $2 FS $3; gsub(/\|/,RS s" ") }1' infile
1 18997 19003 ABCP@CC;8CYUS
1 18997 19003 ABCP@CC;8C
1 18997 19003 ABCP@CC;8C
1 18997 19003 XXYG;UY
1 18997 19003 UOO98,
1 18997 19003 ABCP@CC;8CYUS
2 87737 93837 AASC

$ awk -F'[ |]' '{for(i=4; i<=NF; i++)print $1,$2,$3,$i}' infile
1 18997 19003 ABCP@CC;8CYUS
1 18997 19003 ABCP@CC;8C
1 18997 19003 ABCP@CC;8C
1 18997 19003 XXYG;UY
1 18997 19003 UOO98,
1 18997 19003 ABCP@CC;8CYUS
2 87737 93837 AASC

编辑 - 用于唯一

$ awk -F'[ |]' '{split("",arr);for(i=4; i<=NF; i++){if(!($i in arr))print $1,$2,$3,$i; arr[$i]}}' infile
1 18997 19003 ABCP@CC;8CYUS
1 18997 19003 ABCP@CC;8C
1 18997 19003 XXYG;UY
1 18997 19003 UOO98,
2 87737 93837 AASC