我想将行分成列,每次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 Data
,sep
将更改为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