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

How to put different separators between columns in a file in linux?

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

输入文件:

   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 列和行。

类似于cat file.name | perl -pe 's/([^ ]+ [^ ]+) / /g'

你可以使用这个 awk:

awk '{printf "%s", ;
      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

另一个awk

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

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

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

这个有一个小错误,很难用空格看出。我会先使用 x:

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

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

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

现在用空格替换临时 xy:

echo "1 1 1 1 2 1 2 2 2 1 1 1 2 2 1 2" |
   sed 's/ \([^ ]\) /     /g; s/\([^ ]\) \([^ ]*\)$/  /'
$ 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