我的文件包含以下内容:
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列,并且不会将其附加到新行。
如何获得预期的输出?
答案 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