我有这种记录:
1 2 12345
2 4 98231
...
我需要将第三列拆分为子列以获取此值(例如,用单空格分隔):
1 2 1 2 3 4 5
2 4 9 8 2 3 1
任何人都可以在sed,awk等中为我提供一个很好的解决方案吗?谢谢!
编辑:原始第三列的大小可能会因记录而异。
答案 0 :(得分:6)
% echo '1 2 12345
2 4 98231
...' | awk '{
gsub(/./, "& ", $3)
print
}
'
1 2 1 2 3 4 5
2 4 9 8 2 3 1
...
[使用GNU Awk 3.1.7测试]
这将获取第三列(/./
)中的每个字符($3
)并在打印前将其替换为gsub()
),然后替换空格("& "
)整条线。
答案 1 :(得分:3)
Sed解决方案:
sed -e 's/\([0-9]\)/\1 /g' -e 's/ \+/ /g'
第一个sed表达式用相同的数字替换每个数字后跟一个空格。第二个表达式用一个空格替换每个空格块,从而处理前一个表达式引入的双空格。对于非GNU seds,您可能需要使用两个sed调用(每个-e
一个)。
答案 2 :(得分:2)
perl -pe 's/([0-9])(?! )/\1 /g' INPUT_FILE
<强>测试强>
[jaypal:~/Temp] cat tmp
1 2 12345
2 4 98231
[jaypal:~/Temp] perl -pe 's/([0-9])(?! )/\1 /g' tmp
1 2 1 2 3 4 5
2 4 9 8 2 3 1
sed 's/\d/& /3g' INPUT_FILE
<强>测试强>
[jaypal:~/Temp] sed 's/[0-9]/& /3g' tmp
1 2 1 2 3 4 5
2 4 9 8 2 3 1
gawk '{print $1,$2,gensub(/./,"& ","G", $NF)}' INPUT_FILE
<强>测试强>
[jaypal:~/Temp] gawk '{print $1,$2,gensub(/./,"& ","G", $NF)}' tmp
1 2 1 2 3 4 5
2 4 9 8 2 3 1
答案 3 :(得分:2)
使用awk substr和printf:
[srikanth@myhost ~]$ cat records.log
1 2 12345 6 7
2 4 98231 8 0
[srikanth@myhost ~]$ awk '{ len=length($3); for(i=1; i<=NF; i++) { if(i==3) { for(j = 1; j <= len; j++){ printf substr($3,j,1) " "; } } else { printf $i " "; } } printf("\n"); }' records.log
1 2 1 2 3 4 5 6 7
2 4 9 8 2 3 1 8 0
您也可以将其用于三个以上的列记录。
答案 4 :(得分:1)
如果你不关心空格,这是一个简洁的版本:
sed 's/[0-9]/& /g'
但是如果你需要删除空格,我们只需链接另一个正则表达式:
sed 's/[0-9]/& /g;s/ */ /g'
请注意,这与原始sed
兼容,因此可以在任何类UNIX上运行。
答案 5 :(得分:1)
$ awk -F '' '$1=$1' data.txt | tr -s ' '
1 2 1 2 3 4 5
2 4 9 8 2 3 1
答案 6 :(得分:0)
这可能对您有用:
echo -e "1 2 12345\n2 4 98231" | sed 's/\B\s*/ /g'
1 2 1 2 3 4 5
2 4 9 8 2 3 1
最有可能只是GNU sed。