Это будет именно то, о чем вы просили, независимо от того, содержат ли поля в разделе head (разделенные пробелами) |
s, или поля в хвосте (разделенные |
) пробелами.
С GNU awk для сопоставления 3-го аргумента () и \S/\s
стенография:
$ cat tst.awk
match($0,/^((\S+\s+){3})(.*)/,a) {
split(a[1],h,/\s+/)
split(a[3],t,/[|]/)
print h[1], h[2], h[3], t[4], t[5]
}
$ awk -f tst.awk file
aaa bbb ccc hhh iii
aaa1 bbb1 ccc1 hhh1 iii1
aaa2 bbb2 ccc2 hhh2 iii2
и с любым awk:
$ cat tst.awk
match($0,/^([^[:space:]]+[[:space:]]+){3}/) {
split(substr($0,RSTART,RLENGTH),h,/[[:space:]]+/)
split(substr($0,RSTART+RLENGTH),t,/[|]/)
print h[1], h[2], h[3], t[4], t[5]
}
$ awk -f tst.awk file
aaa bbb ccc hhh iii
aaa1 bbb1 ccc1 hhh1 iii1
aaa2 bbb2 ccc2 hhh2 iii2
Выше предполагается, что вы правы, и только первые 3 поля разделены пробелами, следовательно, {3}
в регулярном выражении. Если вы ошиблись и на самом деле это 4 (как кажется, это может быть в вашем опубликованном примере ввода), тогда, очевидно, просто измените {3}
на {4}
. Это имеет значение, только если вы хотите получить доступ к 4-му разделенному пробелами полю.