拆分特定列

时间:2012-01-02 21:48:40

标签: bash shell sed awk

我有这种记录:

1 2 12345
2 4 98231
...

我需要将第三列拆分为子列以获取此值(例如,用单空格分隔):

1 2 1 2 3 4 5
2 4 9 8 2 3 1

任何人都可以在sed,awk等中为我提供一个很好的解决方案吗?谢谢!

编辑:原始第三列的大小可能会因记录而异。

7 个答案:

答案 0 :(得分:6)

awk中

% 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:

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 

使用gnu sed:

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 

使用gnu awk:

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。