在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
我有一个文件,内容如下:
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