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)
试试这个:
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)
这可能对你有用:
sed 'N;s/\n/ /' file
Run Code Online (Sandbox Code Playgroud)
要么
cat file | paste -d' ' - -
Run Code Online (Sandbox Code Playgroud)
那么你的例子是在Vim.
:g/^/+t.|-j
但那最后一行怎么样?
或者你的意思是这个?
:g/^/j
Run Code Online (Sandbox Code Playgroud)
您可能也对此Vim脚本感兴趣,这使得处理大文件更容易.
http://www.vim.org/scripts/script.php?script_id=1506
| 归档时间: |
|
| 查看次数: |
9431 次 |
| 最近记录: |