我需要将每一行的内容移动到上面一行,这样line2的数据就在line1的旁边,逗号或空格分隔的作品。
输入:
line1
line2
line3
line4
输出:
line1 line2
line3 line4
我一直用vim进行简单的录音,但是当我告诉它做了10万次时,vim似乎崩溃了...我想也许sed会是一个不错的选择,但不知道怎么做我想要什么,或者有更好的选择?
每一行只包含1个数值,我只有一百万行......
答案 0 :(得分:16)
如果我理解正确,你有:
line1
line2
line3
line4
...
你想要:
line1<SEP>line2
line3<SEP>line4
然后您可以使用(g)awk
轻松完成此操作:
awk 'NR % 2 == 1 { o=$0 ; next } { print o "<sep>" $0 }' INPUTFILE
更新:如果行数是奇数,上面将省略最后一行(正如Martin Stettner指出的那样)所以这不会:
awk 'NR % 2 == 1 { o=$0 ; next } { print o "<sep>" $0 } END { if ( NR % 2 == 1 ) { print o } }' INPUTFILE
HTH
答案 1 :(得分:8)
试试这个:
sed -rn 'N;s/\n/ /;p' yourFile
kent$ seq 10
1
2
3
4
5
6
7
8
9
10
kent$ seq 10|sed -rn 'N;s/\n/ /;p'
1 2
3 4
5 6
7 8
9 10
awk也有效:
awk 'NR%2{printf $0" ";next;}1' yourFile
测试
kent$ seq 10|awk 'NR%2{printf $0" ";next;}1'
1 2
3 4
5 6
7 8
9 10
答案 2 :(得分:8)
paste命令可以执行此操作。它的“-s”选项将连接连续的行;并且“-d”选项指定要用作分隔符的字符列表,循环重复它们。首先使用空格,然后使用换行符,然后重复:
seq 10 | paste -sd" \n" -
答案 3 :(得分:7)
这可能对您有用:
sed 'N;s/\n/ /' file
或者
cat file | paste -d' ' - -
或上述的另外两种方式:
paste -d\ - - <file
paste -sd' \n' file
答案 4 :(得分:7)
你的例子就是这个在Vim。
<德尔> :g/^/+t.|-j
德尔>
但那么最后一行呢?
或者你是说这个?
:g/^/j
您可能也对此Vim脚本感兴趣,这样可以更轻松地处理大型文件。
答案 5 :(得分:2)
$ seq 10 | sed '2~2G' | awk -v RS='' '{$1=$1; print}'
1 2
3 4
5 6
7 8
9 10
$ paste -d' ' <(sed -n 'p;n' num.txt) <(sed -n 'n;p' num.txt)
1 2
3 4
5 6
7 8
9 10
$ echo -e 'g/^/,+1j\n%p' | ex num.txt
1 2
3 4
5 6
7 8
9 10
$ seq 10 | awk 'NR%2{printf("%s ", $0); next}1'
1 2
3 4
5 6
7 8
9 10
$ seq 10 | sed 'N;s/\n/ /'
1 2
3 4
5 6
7 8
9 10
注意: $ seq 10 >num.txt
答案 6 :(得分:1)
seq 10 | awk 'ORS=NR%2?FS:RS'
此解决方案使用“三元运算符”来设置ORS
ORS= ....... output register separator (will receive =)
NR%2 ....... test if it has division remainder of Number of Register by 2
?FS:RS ..... FS = "space" RS = "\n" (newline)
答案 7 :(得分:1)
您可以为此使用xargs
。
通常xargs
会使用尽可能多的输入元素,并执行一些命令,并将这些元素视为参数。例如。
cat file | xargs
会回声
line1 line2 line3 line4
但是您可以使用选项-n
cat file | xargs -n 2
将具有每两行连接的预期效果:
line1 line2
line3 line4
如果行中可能包含空格,则必须明确指定输入定界符(换行符)
cat file | xargs -n 2 -d '\n'
最后,不要这样使用cat
,而是说
xargs -n 2 -d '\n' <file
甚至
xargs -n 2 -d '\n' -a file