【发布时间】:2020-06-07 23:53:00
【问题描述】:
我希望将下面的 awk 单行代码翻译成 perl。有可能吗??
awk '{ for(i=1;i<=NF;i++){if(i==NF){printf("%s\n",$NF);}else {printf("%s\t",$i)}}}' file.txt | awk 'NR > 1'
第一个 awk 命令删除前导空列,下一个删除第一行。 下面是file.txt的头部
#FILEOUTPUT
1 137442 2324
2326 139767 4169
6491 143936 94
我从这些命令得到的输出如下
1 137442 2324
2326 139767 4169
6491 143936 94
谢谢, 卡西克
【问题讨论】:
-
请解释一下这个命令的作用。您还可以在 perl 中使用 system(" ") 来执行相同的 shell 命令。不需要转换。但如果这是要求,请让我们知道 file.txt 包含的内容以及您想要的输出。
-
这一行相当于:
awk 'BEGIN{OFS="\t"}{$1=$1}(FNR>1 && NF)' file -
perl -lane 'print join("\t", @F) if $. > 1 && @F' file.txt -
看看从 awk 迁移,例如这个part of a tutorial book.
-
fwiw,你可以在 awk 中使用
awk -v OFS='\t' 'BEGIN{getline}{$1=$1}1'更轻松地做到这一点,它被翻译成 perl 得到perl -anle 'BEGIN{<>;$,="\t"}print@F'。与perl -n或perl -p一样,请注意 perl 解释“有趣”文件名,如>/etc/passwd。