2016-08-03 21 views
0

我有一个巨大的数据文件,其中列之间有空格作为分隔符。 我想在每隔2列之间加上制表符,并且每对列之间需要有2个空格。作为一个小例子来阐明我的意思:如何在Linux中的文件中的列之间放置不同的分隔符?

输入文件:

1 1 1 1 2 1 2 2 2 1 1 1 2 2 1 2 

    1 1 1 1 1 1 2 2 1 1 1 1 2 2 2 2 

    1 1 1 1 1 1 2 2 1 1 1 1 2 2 2 2 

我想要的输出文件如:

1 1 1 1 2 1 2 2 2 1 1 1 2 2 1 2 
1 1 1 1 1 1 2 2 1 1 1 1 2 2 2 2 
1 1 1 1 1 1 2 2 1 1 1 1 2 2 2 2 

任何建议吗?请注意,真实文件具有超过50,000个列和行。

回答

1
$ awk '{for (i=2;i<=NF;i+=2) printf "%s %s%s", $(i-1), $i, (i<NF ? "\t" : ORS)}' file 
1 1 1 1 2 1 2 2 2 1 1 1 2 2 1 2 
1 1 1 1 1 1 2 2 1 1 1 1 2 2 2 2 
1 1 1 1 1 1 2 2 1 1 1 1 2 2 2 2 
0

喜欢的东西cat file.name | perl -pe 's/([^ ]+ [^ ]+) /\1 /g'

0

您可以使用此AWK:

awk '{printf "%s", $1; 
     for (i=2; i<=NF; i++) printf "%s", (i%2 ? " " : " ") $i; print ""}' file 

1 1 1 1 2 1 2 2 2 1 1 1 2 2 1 2 
1 1 1 1 1 1 2 2 1 1 1 1 2 2 2 2 
1 1 1 1 1 1 2 2 1 1 1 1 2 2 2 2 
2

另一awk

$ awk -v OFS=" " '{for(i=2;i<=NF;i+=2)$i=$i" "}1' file 
+0

好吧,另一个'awk'是敏捷的思维,以避免分裂/ MOD开销与步长的好一点2。 –

0

你想一个简单的sed命令状

echo "1 1 1 1 2 1 2 2 2 1 1 1 2 2 1 2" | 
    sed 's/ \([^ ]\)/\1 /g' 

这个有一个很难看到空间的小bug。我会先用x:

echo "1 1 1 1 2 1 2 2 2 1 1 1 2 2 1 2" | 
    sed 's/ \([^ ]\) /xx\1xxx/g' 
# Result: 
1xx1xxx1xx1xxx2xx1xxx2xx2xxx2xx1xxx1xx1xxx2xx2xxx1 2 

哇!当你有偶数个字段时,最后一个分隔符被跳过。您可以修补它(现在我将使用y来标记修补程序)。

echo "1 1 1 1 2 1 2 2 2 1 1 1 2 2 1 2" | 
    sed 's/ \([^ ]\) /xx\1xxx/g; s/\([^ ]\) \([^ ]*\)$/\1yy\2/' 
# Result 
1xx1xxx1xx1xxx2xx1xxx2xx2xxx2xx1xxx1xx1xxx2xx2xxx1yy2 

现在更换临时xy用空格:

echo "1 1 1 1 2 1 2 2 2 1 1 1 2 2 1 2" | 
    sed 's/ \([^ ]\)/\1 /g; s/\([^ ]\) \([^ ]*\)$/\1 \2/' 
相关问题