我有一个巨大的数据文件,其中列之间有空格作为分隔符。 我想把每个其他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个。
答案 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
现在用空格替换临时x
和y
:
echo "1 1 1 1 2 1 2 2 2 1 1 1 2 2 1 2" |
sed 's/ \([^ ]\) / \1 /g; s/\([^ ]\) \([^ ]*\)$/\1 \2/'