如何在 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
现在用空格替换临时 x
和 y
:
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
我有一个巨大的数据文件,其中列之间有 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
现在用空格替换临时 x
和 y
:
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