我有一个很长的文本文件,其中的数据像这样重复
510068893
510069716
620087756
510068729
620089710
560034147
510069875
M
M
M
M
M
M
M
1957
5/2/1980
1960
1978
5/8/1988
1984
1981
ABASSI FADHIL KHAMIS
ABDALLA HAMAD JUMA
ABDALLA ALI MAHADHI
ABDALLA ALI MFAKI
ABDALLA HAMAD KHAMIS
ABDALLA JUMA ALI
ABDALLA JUMA MABROUK
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
510068695
510068680
620086828
560034266
620088288
560033477
510068873
M
M
M
M
M
M
M
5/10/1983
1985
1937
1951
1974
14/5/1984
1987
ABDALLA KHAMIS ALI
ABDALLA KHAMIS HAMAD
ABDALLA KHAMIS USHURU
ABDALLA MOHAMMED JUMA
ABDALLA MOHAMMED SALEH
ABDALLA OMAR ABEID
ABDALLA OMAR NUHU
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
Sokoni
我想将每组的第一行连接起来形成一行,并重复每组的第二行,直到完成。我如何使用 Vim 或 Perl 脚本来做到这一点。
输出应该看起来像
510068893, M, 1957, ABASSI FADHIL KHAMIS, Sokoni 510069716, M, 5/2/1980, ABDALLA HAMAD JUMA, Sokoni
620087756, M, 1960, ABDALLA ALI MAHADHI, Sokoni 510068729, M, 1978, ABDALLA ALI MFAKI, Sokoni
etc.
答案1
如果始终需要收集 7 个条目(加上一个空行)的数据,则该awk
程序将收集相应的数据并在最后打印它们:
awk '{a[NR%8]=a[NR%8]" "$0} END{for (i=1;i<=7;i++) print a[i]}'
(请注意,您的数据样本似乎有很多尾随空白;如果您希望删除这些空白而不是加入这些空白,请适当调整您的问题,然后我将相应地调整我的答案。)
编辑:要创建逗号分隔符,如上面注释中的示例输出所示,请使用:
awk '{a[NR%8]=a[NR%8]", "$0} END{for (i=1;i<=7;i++) print substr(a[i],3)}'
答案2
gawk ' BEGIN{RS=""; FS="\n"}
{for(i=1;i<NF;i++) {a[i]=a[i]" || "$i} }
END {for(i in a){ print a[i]}}'
(此解决方案可能会更改行的顺序;下一个版本保持行顺序)。
更好的是,改进它并创建一个可重用的命令“vert_transpose”
#!/usr/bin/gawk -f
BEGIN {RS=""; FS="\n"}
l<=NF {l=NF}
{for(i=1;i<=NF;i++) { a[i]=a[i]" || "$i } }
END {for(i=1;i<=l ;i++) { print a[i] } }
chmod 并将其安装在某些中$HOME/bin
;并在必要时将其用作常用命令:
- 在bash中:
vert_transpose longfile
- 里面vim:
:%! vert_transpose
答案3
要从每行中删除尾随空格并在末尾添加空行:
sed 's/\s*$//;$a\\' very.long.text.file
可以通过管道传输
awk '
BEGIN{
RS="\n\n"
FS="\n"}
{for (i=1;i<=NF;i++)
A[i]=A[i] s $i
s=","}
NR%5==0{
for(i in A)
printf "%s,%g\n" ,A[i]
s=""
delete A
print s}'
每第 40 行清空内存以适合大文件。
答案4
使用Ctrl+V启用可视块并选择要连接的行,然后点击Shift+ J(即大写 J
)将行合并为一行。