当行中找到任何字符时将行分为列

当行中找到任何字符时将行分为列

我想将行分成列,每次New Data在文件中找到该短语时开始一个新行:

输入

New Data
52.6114082616
41.8319773432
75.6986111112
74.6176129172
New Data
100.0
100.0
100.0
8.00000000003
99.7916666667
42.435664564566

输出

52.6114082616 41.8319773432 75.6986111112 74.6176129172
100.0 100.0 100.0 8.00000000003 99.7916666667 42.435664564566

我尝试过xargs

awk '{print$1}' file.txt  | xargs -n2 echo

但这不包括空行,我也想要空行。

答案1

用于awk提供备用分隔符:

awk '/^New Data/ {sep=ORS; next} {printf "%s", sep $0; sep=OFS} END{print ""}' file

如果记录匹配正则表达式^New Datasep将更改为ORS/newline,否则sep将更改为OFS/space。

答案2

使用perl:

$ perl -lne '$\=" ";if (/New Data/){ $\="\n"; s/.*//g; } ;print $_;print "\n" if eof' file

52.6114082616 41.8319773432 75.6986111112 74.6176129172 
100.0 100.0 100.0 8.00000000003 99.7916666667 42.435664564566 

答案3

POSIX sed。在 sed 的模式空间中,我们累积读取的所有行,直到遇到包含新数据的行。此时,我们打印并删除模式空间,然后返回 sed 脚本的顶部以获取更多信息。需要注意的是,我们从模式空间中斩断了领先的新数据线。测试命令 t 将继续将换行符转换为空格,直到遇到下一个新数据。然后重复循环。

sed -e ':a
  $!N;/^New Data\n/D
  /\nNew Data$/! s/\n/ /;ta
  P;D
' file

GNU sed:这里我们在保留空间中累积非新数据行。遇到新数据行(删除第一个数据行)时,我们获取存储在保留中的内容+将保留清空。然后将所有换行符更改为空格。

sed -e '
  /^New Data$/!{H;$!d;}
  1d;z;x;s/.//;y/\n/ /
' file

Perl 的 slurrp 模式:我们将整个文件读入 Perl 的模式空间 $_。

选项:

: `-0777` slurps the input intob$_. 
: `-l` sets   ORS = RS = \n
: `-a` autosplits the pattern space ibto fields and pytsin @F array. 
 `-n` no print the pattern space by default.
: `-F` specifies the field delimiter used to split the pattern space.

特殊变量:

 : `$"` value is space by default.
 : `$\ ` output record separator newline
 : `$#F` index of the last element of tge array @F, indices start from zero. 

perl -F'/^New\hData\n/m' -lan -0777e '
  print join $", split $\ for @F[1..$#F];
' file 


perl -lne '
  push @A, $_ if ! /^New Data$/;
  print join $", splice @A if eof || // && $.>1;
' file 


perl -lpe '
  ($_, $p, $\)
    = /New/ ? ($p, undef, defined $p ? $/ : $,)
    : ! eof ? ($p, $_,    defined $p ? $" : $,)
    :         (qq[$p$"$_], "foo", $/)
    ;
' file

输出:

52.6114082616 41.8319773432 75.6986111112 74.6176129172
100.0 100.0 100.0 8.00000000003 99.7916666667 42.435664564566

相关内容