如何在linux中的文件中的列之间放置不同的分隔符?

时间:2016-08-03 20:18:10

标签: linux shell awk sed tex

我有一个巨大的数据文件,其中列之间有空格作为分隔符。 我想把每个其他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

我希望输出文件像:

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个。

5 个答案:

答案 0 :(得分:2)

另一个awk

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

这样的东西

答案 3 :(得分: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

答案 4 :(得分:0)

您想要一个简单的sed命令,如

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

这个有一个很难看到空间的小虫子。我将首先使用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/'