【发布时间】:2015-08-16 19:34:01
【问题描述】:
我有一个包含 5 列的制表符分隔的文本文件,我希望每一行都是它自己的 txt 文件,其中包含来自第 2-5 列的信息并以第 1 列命名。
例如,我的 txt 文件有数百行类似这样:
sample1name_oligos 引物 forwardseq reverseseq sample1name
sample2name_oligos 引物 forwardseq reverseseq sample2name
我想要一个名为 sample1name_oligos 的 txt 文件,如下所示:
primer forwardseq reverseseq sample1name
还有一个名为 sample1name_oligos 的 txt 文件,如下所示:
primer forwardseq reverseseq sample1name
我尝试了两种方法:
1。我找到了我认为的解决方案:
awk '{print substr($0,match($0,$2)) >> ($1 ".txt" )}' 文件名
这适用于我制作的测试文件(5 行),但是当我在 100 多行文件上运行它时,我得到了前 17 个文件,然后出现错误:
awk: File18.txt 打开的文件太多 输入记录号 18,文件 myfile.txt 源代码行号 1
我删除了第 18 行并重试,得到了同样的错误。我删除了前 20 行并重试,得到了同样的错误。
2。从同一个链接,我试过了
cat myfile.txt |一边读线;做回声 $LINE > "$LINE.txt";完成。
这为每一行创建了一个文件,如下所示:
sample1name_oligos 引物 forwardseq reverseseq sample1name
文件被命名为:
sample1name_oligos 引物 forwardseq reverseseq sample1name.
我不知道从这里去哪里。我会很感激任何帮助。如果不是很明显,我没有什么终端经验,所以我也很感激能解释我所缺少的答案。
邦妮
【问题讨论】:
-
在您的 awk 中,您必须在完成写入后
close( $1 ".txt" )文件(在您的情况下的每一行之后)。这由too many open files错误指示。 -
@n0741337 ... 或使用 GNU awk,它会根据需要简单地为您处理。
-
@Bonnie 在我的测试中,
awk '{print substr($0,match($0,$2)) >> ( $1 ".txt" )}' filename适用于 100 多行。请检查可疑行的第一个字段中是否有额外的空白,这会导致输出文件名重复。 -
@xb 这与文件内容无关,这是 OP 正在使用的 awk 的同时打开文件问题。
-
@Bonnie 从不尝试删除第一个(或任何)字段的
substr($0,match($0,$2))。想象一下像foobar foo bar这样的行会造成什么混乱。并且永远不要像在你的第二个脚本中那样使用 shell 循环(这会非常慢,并且在给定一些输入文件内容的情况下绝对会破坏你的文件)来操作文本 - UNIX shell 是一个调用 UNIX 工具和 UNIX 文本操作工具的环境是 awk,所以就使用它。
标签: awk while-loop