我有一个具有以下格式的文件:
>Country1
Aus
trali
a
>Country5
Swi
tzer
land
>Country2
Net
herland
s
我想输出以下格式的文件:
>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands
答案1
直接Perl
解决方案:
$ perl -lne '
if(/^>/) {printf "%s ", $_;next}
if(/^$/) {printf "\n";next}
printf "%s", $_;
' file
>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands
或者更短的方式:
$ perl -ane 'BEGIN{$/="";};print "$F[0] ",@F[1..$#F],"\n"' file
>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands
设置$/
为空字符串会导致 Perl 切换到段落模式,这意味着记录分隔符是一个或多个空行。
答案2
使用-p
转变逐行处理文件并输出每个处理后的行。如果该行以 开头,则将换行符替换为空格>
;如果该行以另一个非换行符开头(即,如果它不为空),则将其替换为空。
perl -pe 'if (/^>/) {s/\n/ /} elsif (/^./) {s/\n//}'
答案3
使用 Raku(以前称为 Perl_6)
raku -ne 'print "$_ " if m/^\>/; .print if m/<alpha>+ $/; .put unless .chars;'
输入示例:
>Country1
Aus
trali
a
>Country5
Swi
tzer
land
>Country2
Net
herland
s
示例输出:
>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands
感谢@Gilles,他能够在 Perl 中通过单个 if/else 语句来完成此操作。上面的代码使用了三个 Raku 语句,利用了print
和之间的差异put
。在 Raku 中,print
不添加换行符,而在put
Raku 中添加换行符。此外,在 Raku 中,~
波形符用于字符串连接,因此插值"$_ "
可以写成$_~" "
。
Raku 对于同源问题的一个(可能?)优势是chars
例程的严格 Unicode 实现(NFG 规范化)。请参阅底部的网址。
https://6guts.wordpress.com/2015/04/12/this-week-unicode-normalization-many-rts/
https://docs.raku.org/routine/chars
https://raku.org
答案4
如果输入行中没有选项卡,您可以使用此方法:
$ awk NF infile | awk '{$1=$1};1' | paste - - - - | sed 's/ //2g'
>Country1 Australia
>Country5 Switzerland
>Country2 Netherlands
第一个 awk 删除空行。第二个 awk 修剪前导/尾随空格。粘贴命令(带有四个连字符)合并由制表符分隔的每四行。最后 sed 删除不需要的选项卡。如果您愿意,请将第一个选项卡替换为空格。