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

jan*_*thh 15 vim text-processing sed large-files

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

输入:

line1
line2
line3
line4
Run Code Online (Sandbox Code Playgroud)

输出:

line1 line2
line3 line4
Run Code Online (Sandbox Code Playgroud)

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

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

Zso*_*kai 17

如果我理解正确,你有:

line1 
line2
line3
line4
...
Run Code Online (Sandbox Code Playgroud)

你想要:

line1<SEP>line2
line3<SEP>line4
Run Code Online (Sandbox Code Playgroud)

然后你可以这样轻松地做到这(g)awk一点:

awk 'NR % 2 == 1 { o=$0 ; next } { print o "<sep>" $0 }' INPUTFILE
Run Code Online (Sandbox Code Playgroud)

在这里看到它.

更新:如果行数是奇数,上面将省略最后一行(正如Martin Stettner指出的那样),所以这不会:

awk 'NR % 2 == 1 { o=$0 ; next } { print o "<sep>" $0 } END { if ( NR % 2 == 1 ) { print o } }' INPUTFILE
Run Code Online (Sandbox Code Playgroud)

HTH


Bob*_*ied 10

paste命令可以执行此操作.它的"-s"选项将连接连续的行; 并且"-d"选项指定要用作分隔符的字符列表,循环重复它们.首先使用空格,然后使用换行符,然后重复:

seq 10 | paste -sd" \n" -
Run Code Online (Sandbox Code Playgroud)


Ken*_*ent 8

试试这个:

sed -rn 'N;s/\n/ /;p' yourFile
Run Code Online (Sandbox Code Playgroud)

用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
Run Code Online (Sandbox Code Playgroud)

awk也有效:

awk 'NR%2{printf $0" ";next;}1' yourFile
Run Code Online (Sandbox Code Playgroud)

测试

kent$  seq 10|awk 'NR%2{printf $0" ";next;}1'
1 2
3 4
5 6
7 8
9 10
Run Code Online (Sandbox Code Playgroud)


pot*_*ong 7

这可能对你有用:

sed 'N;s/\n/ /' file
Run Code Online (Sandbox Code Playgroud)

要么

cat file | paste -d' ' - - 
Run Code Online (Sandbox Code Playgroud)


198*_*983 7

那么你的例子是在Vim.

:g/^/+t.|-j

但那最后一行怎么样?

或者你的意思是这个?

:g/^/j
Run Code Online (Sandbox Code Playgroud)

您可能也对此Vim脚本感兴趣,这使得处理大文件更容易.

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