在awk中分隔符后打印与新行切割相同的列

Print the same columns as a new line cutting after delimiter in awk

我有一个文件,内容如下:

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([=14=],a,"|"); print a[1],a[2],a[3],a[4]}' 但是,它只拆分同一行中的第 4 列,并且不会将其附加到新行。

如何获得预期的输出?

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

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

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

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

使用awk

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

awk -F'[ |]' '{for(i=4; i<=NF; i++)print ,,,$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=  FS  FS ; 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 ,,,$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 ,,,$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