如何在sed语句中评估awk?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在sed语句中评估awk?相关的知识,希望对你有一定的参考价值。

对于文件夹中的每个.fastq文件,我需要将读取的文件的文件名追加到标题行。

假设fastq文件read1.with.long.identifier.fastq的前8行是:

@M04803:91:000000000-D3852:1:1102:14324:1448 1:N:0:GTGTCTCT+TGAGCAGT
TTTTGTTTCCTCTTCTTATTGTTATTCTTATGTTCATCTGGTATCCCTGCCTGATCCGTGTTCAACCTTGCGAATAGG
+
11111B1133B1111BF3BA33D3B3BDG331DBB33D3A1B1D12BB10BAA0B110//0B2221ABG11//AA/11
@M04803:91:000000000-D3852:1:1102:12470:1826 1:N:0:GTGTCTCT+AGAGCAGT
CCTGGGAGCCTCCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCCTACCTGATTTGAGGTCAAGTTTCGAGTTTTC
+
1>>1A1B1>>>C1AAEFGGEADFGGHHHHHDGDFHHFHGGCAECGHHGFFHHHHFHHGFFEFHHHHHHHHGGHFGHHH

我希望他们阅读:

@M04803:91:000000000-D3852:1:1102:14324:1448 1:N:0:GTGTCTCT+TGAGCAGT read1.with.long.identifier
TTTTGTTTCCTCTTCTTATTGTTATTCTTATGTTCATCTGGTATCCCTGCCTGATCCGTGTTCAACCTTGCGAATAGG
+
11111B1133B1111BF3BA33D3B3BDG331DBB33D3A1B1D12BB10BAA0B110//0B2221ABG11//AA/11
@M04803:91:000000000-D3852:1:1102:12470:1826 1:N:0:GTGTCTCT+AGAGCAGT read1.with.long.identifier
CCTGGGAGCCTCCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCCTACCTGATTTGAGGTCAAGTTTCGAGTTTTC
+
1>>1A1B1>>>C1AAEFGGEADFGGHHHHHDGDFHHFHGGCAECGHHGFFHHHHFHHGFFEFHHHHHHHHGGHFGHHH

使用:

cat read1.with.long.identifier.fastq | sed "/^@......:/ s/$/ 
awk "FILENAME"     read1.with.long.identifier.fastq/" | tr "	" "
" >  
read1_new_headers.fastq

但是,这会产生:

@M04803:91:000000000-D3852:1:1102:14324:1448 1:N:0:GTGTCTCT+TGAGCAGT awk     "FILENAME" read1.with.long.identifier.fastq
TTTTGTTTCCTCTTCTTATTGTTATTCTTATGTTCATCTGGTATCCCTGCCTGATCCGTGTTCAACCTTGCGAATAGG
+
11111B1133B1111BF3BA33D3B3BDG331DBB33D3A1B1D12BB10BAA0B110//0B2221ABG11//AA/11
@M04803:91:000000000-D3852:1:1102:12470:1826 1:N:0:GTGTCTCT+AGAGCAGT awk     "FILENAME" read1.with.long.identifier.fastq
CCTGGGAGCCTCCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCCTACCTGATTTGAGGTCAAGTTTCGAGTTTTC
+
1>>1A1B1>>>C1AAEFGGEADFGGHHHHHDGDFHHFHGGCAECGHHGFFHHHHFHHGFFEFHHHHHHHHGGHFGHHH

这是一个非迭代版本。我知道我可以拿出awk和FILENAME并粘贴文件名“read1.with.new.identifier”并得到我需要的东西,但在实际数据中我需要迭代地执行此操作(awk FILENAME i ...)对于许多具有不同文件名的文件,需要一些能自动评估文件名的文件。我显然错误地想到了这一点。你如何在sed语句中评估awk?

答案

现在我了解read1.with.long.identifier实际上是一个文件名,我的示例代码更容易,不需要sed

awk '/^@/{$0=$0 " " FILENAME }1' file1 file2 ... > all_output

应该将当前的FILENAME附加到以@开头的任何行的末尾。

我使用data.txt作为文件生成的测试

@M04803:91:000000000-D3852:1:1102:14324:1448 1:N:0:GTGTCTCT+TGAGCAGT data.txt
TTTTGTTTCCTCTTCTTATTGTTATTCTTATGTTCATCTGGTATCCCTGCCTGATCCGTGTTCAACCTTGCGAATAGG
+
11111B1133B1111BF3BA33D3B3BDG331DBB33D3A1B1D12BB10BAA0B110//0B2221ABG11//AA/11
@M04803:91:000000000-D3852:1:1102:12470:1826 1:N:0:GTGTCTCT+AGAGCAGT data.txt
CCTGGGAGCCTCCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCCTACCTGATTTGAGGTCAAGTTTCGAGTTTTC
+
1>>1A1B1>>>C1AAEFGGEADFGGHHHHHDGDFHHFHGGCAECGHHGFFHHHHFHHGFFEFHHHHHHHHGGHFGHHH

如果需要覆盖需要for循环和临时文件的每个文件。但是如果没有更多的反馈,我不想再花费更多的时间来发现我正走向错误的方向。

非常紧张

以上是关于如何在sed语句中评估awk?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sed 或 awk 预处理 C/C++ 代码时如何定位可靠的函数?

如何计算bash中一列数据中的连续重复次数?

如何在 SED 或 AWK 的行中添加双引号?

如何使用 sed 或 awk 命令用变量(变量保存 Unix 脚本)查找和替换文本

grep awk sed echo

如何使用 shell(awk、sed 等)删除文件中的前两列