我有像示例一样拆分文本的情况
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0
AE|B1|CC|DE| |EX|FF|0
AR|BE|CA|D1| 5#6#3#;4#3#4;|ED|G|
我需要像这个一样的文本
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|3|1|1
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|1|4|4
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|5|1|4
AE|B1|CC|DE| |EX|FF|0|||
AR|BE|CA|D1| 5#6#3#;4#3#4;|ED|G||5|6|3
AR|BE|CA|D1| 5#6#3#;4#3#4;|ED|G||4|3|4
我已经试过使用了
awk'BEGIN{FS=OFS="|"}{split($5,a,/;/(;for(i in a({if(a[i]($9=a[i];否则,下一个;gsub(/#/,"|",$9(;打印}}
但是,如果$5只有空间,它不会添加列。
使用任何awk:
$ cat tst.awk
{
tgt = ( /;/ ? $2 : "###;")
gsub(/#/,"|",tgt)
n = split(tgt,a,/|?;/)
for ( i=1; i<n; i++ ) {
print $0 "|" a[i]
}
}
$ awk -f tst.awk file
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|3|1|1
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|1|4|4
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|5|1|4
AE|B1|CC|DE| |EX|FF|0|||
AR|BE|CA|D1| 5#6#3#;4#3#4;|ED|G||5|6|3
AR|BE|CA|D1| 5#6#3#;4#3#4;|ED|G||4|3|4
第一个解决方案:
使用您显示的示例,请尝试以下awk
代码。
awk '
match($0,/(([0-9]+#)+);[^|]*/){
num=split(substr($0,RSTART,RLENGTH),arr,";")
for(i=1;i<num;i++){
sub(/#$/,"",arr[i])
gsub(/#/,"|",arr[i])
print $0"|"arr[i]
}
next
}
{
print $0 "|||"
}
' Input_file
第二个解决方案:使用awk
中的函数方法,使用您显示的示例,请尝试以下awk
代码。我们可以将多个字段传递到我们想要查找的函数中,并获得其值,例如:在这种情况下,我将第2、第3和第4个字段的数字传递到函数中,对它们进行处理以获得所需的输出。但如果你有太多的字段,那么我建议使用上面显示的我的第一个解决方案。
awk -F' |;' '
function getValues(fields){
num=split(fields,arr,",")
for(i=1;i<=num;i++){
if($arr[i]~/^([0-9]+#)+[0-9]*$/){
val=$arr[i]
sub(/#$/,"",val)
gsub(/#/,"|",val)
print $0"|"val
}
}
}
/([0-9]+#)+;/{
getValues("2,3,4")
next
}
{
print $0 "|||"
}
' Input_file
在两种解决方案中,输出如下:
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|3|1|1
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|1|4|4
A|B|C|D| 3#1#1#;1#4#4;5#1#4;|E|F|0|5|1|4
AE|B1|CC|DE| |EX|FF|0|||
AR|BE|CA|D1| 5#6#3#;4#3#4;|ED|G||5|6|3
AR|BE|CA|D1| 5#6#3#;4#3#4;|ED|G||4|3|4