【问题标题】:how to evaluate awk in a sed statement?如何在 sed 语句中评估 awk?
【发布时间】:2018-06-25 15:29:58
【问题描述】:

对于文件夹中的每个.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 "\t" "\n" >  
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?

【问题讨论】:

  • 为什么不只是 awk '/^@/$0=$0 "read1.with.long.identifier"}1' file1 file2 ... ?从sed 调用awk 几乎可以肯定是错误的方法。你能编辑你的数据,使行不超过 40 个字符吗?读者将更容易剪切/粘贴到他们的测试环境中。祝你好运。
  • 如果您为每个文件名need to to this iteratively,您可能需要将文件名保存在变量中?
  • 看不懂evaluate awk in a sed statement
  • 你应该在你的问题中简单地告诉 3 件事。 1-您对代码标签中的示例 Input_file 有什么要求。 2- 代码标签中的预期输出样本是什么。 3-到目前为止你尝试了什么。用简单的英语。它将帮助我们为您提供帮助。

标签: awk sed filenames


【解决方案1】:

现在我知道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 循环和临时文件的每个文件。但如果没有更多反馈,我不想再花更多时间发现自己走错了方向。

IHTH

【讨论】:

  • 不错。虽然看起来 OP 希望从附加到文件行的字符串中删除 .fastq 扩展名。剥离".txt" 的最快方法是什么?也许只是sub(/\.txt$/,"")
  • @ghoti :很好。我必须插入f=FILENAME;sub(/\.txt/,"",f) 并替换FILENAMEf 的行尾。在更改上面的代码之前,我将等待 O.P. 的消息是否是要求或错字。谢谢,祝大家好运!
  • 我认为awk '/^@/{$0=$0 " " FILENAME; sub(/\.txt$/,"") }1' 就足够了。
  • 多啊,是的,。对我来说早。忘了sub() 默认修改$0。谢谢!
猜你喜欢
  • 2015-11-14
  • 2010-12-01
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
相关资源
最近更新 更多