如何使用vim,sed或其他类似工具在大文件(100万行)中连接成对的连续行?

时间:2011-12-17 14:56:14

标签: vim sed large-files text-processing

我需要将每一行的内容移动到上面一行,这样line2的数据就在line1的旁边,逗号或空格分隔的作品。

输入:

line1
line2
line3
line4

输出:

line1 line2
line3 line4

我一直用vim进行简单的录音,但是当我告诉它做了10万次时,vim似乎崩溃了...我想也许sed会是一个不错的选择,但不知道怎么做我想要什么,或者有更好的选择?

每一行只包含1个数值,我只有一百万行......

8 个答案:

答案 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

See it in action here

更新:如果行数是奇数,上面将省略最后一行(正如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
使用seq进行测试:

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脚本感兴趣,这样可以更轻松地处理大型文件。

http://www.vim.org/scripts/script.php?script_id=1506

答案 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