使用鉴别器连接多行

发布于 2024-08-20 09:58:24 字数 257 浏览 4 评论 0原文

我有这样的输入 输入

a,b,c
d,e,f
g,h,i
k,l,m
n,o,p
q,r,s

我希望能够使用像“|”这样的鉴别器连接行

输出:

a,b,c|d,e,f|g,h,i 
k,l,m|n,o.p|q,r,s

该文件有 100 万行,我希望能够像前面的示例一样连接行。

关于如何解决这个问题有什么想法吗?

I have the input like this

Input:

a,b,c
d,e,f
g,h,i
k,l,m
n,o,p
q,r,s

I wan to be able to concatenate the lines with a discriminator like "|"

Output:

a,b,c|d,e,f|g,h,i 
k,l,m|n,o.p|q,r,s

The file has 1million lines and I want to be able to concatenate lines like the example before.

Any ideas about how to approach this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

初吻给了烟 2024-08-27 09:58:24

@OP,如果你想

$ awk 'ORS=(NR%3==0)?"\n":"|"' file
a,b,c|d,e,f|g,h,i
k,l,m|n,o,p|q,r,s

用 Perl 每 3 条记录对它们进行分组,

$ perl -lne 'print $_ if $\ = ($. % 3 == 0) ? "\n" : "|"' file
a,b,c|d,e,f|g,h,i
k,l,m|n,o,p|q,r,s

@OP, if you want to group them for every 3 records,

$ awk 'ORS=(NR%3==0)?"\n":"|"' file
a,b,c|d,e,f|g,h,i
k,l,m|n,o,p|q,r,s

with Perl,

$ perl -lne 'print $_ if $\ = ($. % 3 == 0) ? "\n" : "|"' file
a,b,c|d,e,f|g,h,i
k,l,m|n,o,p|q,r,s
余生再见 2024-08-27 09:58:24

由于您的标签包含 sed 这里是一种使用它的方法:

sed 'N;N;s/\n/|/g' datafile

Since your tags include sed here is a way to use it:

sed 'N;N;s/\n/|/g' datafile
浅紫色的梦幻 2024-08-27 09:58:24

呆呆地:

BEGIN {
  state=0
}

state==0 {
  line=$0
  state=1
  next
}

state==1 {
  line=line "|" $0
  state=2
  next
}

state==2 {
  print line "|" $0
  state=0
  next
}

gawk:

BEGIN {
  state=0
}

state==0 {
  line=$0
  state=1
  next
}

state==1 {
  line=line "|" $0
  state=2
  next
}

state==2 {
  print line "|" $0
  state=0
  next
}
苦行僧 2024-08-27 09:58:24

如果 Perl 没问题,你可以尝试:

$i = 1;
while(<>) {
        chomp;
        unless($i % 3)
        { print "$line\n"; $i = 1; $line = "";}
        $line .= "$_|";
        $i++;
}

运行:

perl perlfile.pl 1millionlinesfile.txt

If Perl is fine, you can try:

$i = 1;
while(<>) {
        chomp;
        unless($i % 3)
        { print "$line\n"; $i = 1; $line = "";}
        $line .= "$_|";
        $i++;
}

to run:

perl perlfile.pl 1millionlinesfile.txt
苹果你个爱泡泡 2024-08-27 09:58:24
$ paste -sd'|' input | sed -re 's/([^|]+\|[^|]+\|[^|]+)\|/\1\n/g'

使用 paste,我们将这些行连接在一起,然后然后 sed 将它们切块。该模式抓取 3 个管道终止字段,并用换行符替换它们各自的最终管道。

使用 Perl:

#! /usr/bin/perl -ln

push @a => $_;
if (@a == 3) {
  print join "|" => @a;
  @a = ();
}

END { print join "|" => @a if @a }
$ paste -sd'|' input | sed -re 's/([^|]+\|[^|]+\|[^|]+)\|/\1\n/g'

With paste, we join the lines together, and then sed dices them up. The pattern grabs runs of 3 pipe-terminated fields and replaces their respective final pipes with newlines.

With Perl:

#! /usr/bin/perl -ln

push @a => $_;
if (@a == 3) {
  print join "|" => @a;
  @a = ();
}

END { print join "|" => @a if @a }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文