我想打印奇数行(1,3,5,7 ..)而没有任何改变,但偶数行(2,4,6,8)处理以grep开头的管道。我想把所有内容写入新文件(奇数行没有任何变化,偶数行的新值)。
我知道如何在awk中打印每一行:
awk ' NR % 2 == 1 { print; } NR % 2 ==0 {print; }' file.fasta
但是,对于偶数行,我不想使用 {print; }
但我想用我的grep管道代替。
建议将不胜感激。非常感谢。
我想打印奇数行(1,3,5,7 ..)而没有任何改变,但偶数行(2,4,6,8)处理以grep开头的管道。我想把所有内容写入新文件(奇数行没有任何变化,偶数行的新值)。
我知道如何在awk中打印每一行:
awk ' NR % 2 == 1 { print; } NR % 2 ==0 {print; }' file.fasta
但是,对于偶数行,我不想使用 {print; }
但我想用我的grep管道代替。
建议将不胜感激。非常感谢。
如果你打算做一个简单的事情 grep
,你可以取消额外的步骤并在awk中进行过滤,例如:
awk 'NR % 2 {print} !(NR % 2) && /pattern/ {print}' file.fasta
但是,如果你打算做更多的话,那就像 chepner已经指出了,你确实可以从awk内部管道。例如:
awk 'NR % 2 {print} !(NR % 2) {print | "grep pattern | rev" }' file.fasta
这打开了命令的管道 "pattern | rev"
(注意周围的引号)并将打印输出重定向到它。请注意,这种情况下的输出可能不像您预期的那样;你将最终输出所有奇数行,然后输出管道命令(消耗偶数行)。
(根据您的评论)计算每个偶数行中的字符数,请尝试:
awk 'NR % 2 {print} !(NR % 2) {print length($0)}' file.fasta
你可以直接从里面管道 awk
:
awk ' NR % 2 == 1 { print; } NR % 2 ==0 {print | "grep -o [actgnACTGN] | wc -l"; }' file.fasta
但请注意,这不会保留输入文件的顺序。
(选择的答案对于手头的任务更好,但我将这里留下这个答案作为将print语句传递给外部命令的示例。)
为了使您的管道输出按AWK输出顺序显示,您需要在每次迭代时关闭管道。当然,这是非常低效的。
awk 'BEGIN{ cmd = "grep -io \047[actgn]\047 | wc -l" } NR % 2 { print } NR % 2 == 0 { print | cmd; close(cmd) }' file.fasta
您显然不想计算不在指定列表中的字符,所以 length($0)
不行。这将工作,应该比管道方法快得多:
awk 'NR % 2 { print } NR % 2 == 0 {n = split($0, a, /[^actgnACTGN]/); print length($0) - n + 1}' file.fasta
它的工作原理是使用你的字符分割线条 别 想要作为分隔符并从行的长度中减去子串的计数并添加1.本质上,它从行的长度中减去不需要的字符的数量,从而留下想要的字符的数量作为结果。