Awk 如何将文本文件中的每一行保存为新文件

Awk 如何将文本文件中的每一行保存为新文件,awk,while-loop,Awk,While Loop,我有一个以制表符分隔的文本文件,有5列,我希望每一行都是自己的txt文件,其中包含第2-5列的信息,并以第1列命名 例如,我的txt文件中有数百行与此类似: sample1name_oligos primer forwardseq reverseseq sample1name sample2name\u寡核苷酸引物正向序列反向序列SEQ sample2name 我希望有一个名为sample1name\u oligos的txt文件,如下所示: primer forwardseq reversese

我有一个以制表符分隔的文本文件,有5列,我希望每一行都是自己的txt文件,其中包含第2-5列的信息,并以第1列命名

例如,我的txt文件中有数百行与此类似:

sample1name_oligos primer forwardseq reverseseq sample1name

sample2name\u寡核苷酸引物正向序列反向序列SEQ sample2name

我希望有一个名为sample1name\u oligos的txt文件,如下所示:

primer forwardseq reverseseq样本1名称

还有一个名为sample1name_oligos的txt文件,如下所示:

primer forwardseq reverseseq样本1名称

我试过两种方法:

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 |在读取行时;执行echo$LINE>“$LINE.txt”;完成了

这为每一行创建了一个如下所示的文件:

sample1name_oligos primer forwardseq reverseseq sample1name

文件名为:

sample1name_oligos primer forwardseq reverseseq sample1name

我不知道接下来该怎么办。我非常感谢你的帮助。如果不明显的话,我几乎没有终端经验,所以我也很感激能解释我遗漏了什么的答案


邦妮

这一个对我有用。刚刚在第二个解决方案中添加了一个计数器


计数器=0;在读取行时键入您的_file.txt;do(counter++);echo$LINE>“path/to/your/files/$counter.txt”;完成

在您的awk中,您必须在完成写入(案例中的每一行之后)时关闭($1.txt)文件。这由“打开的文件过多”错误指示。@n0741337。。。或者使用GNU awk,它只是根据需要为您处理这些。@Bonnie在我的测试中,
awk'{print substr($0,match($0,$2))>>($1.txt”)}文件名
可以处理100多行。务必检查可疑行的第一个字段中是否有额外的空白,这会导致输出文件名重复。@xb这与文件内容无关,这是OP使用的awk同时打开的文件问题。@Bonnie never Do
substr($0,match($0,$2))
尝试删除第一个(或任何)领域想象一下,像
foobar-foobar
这样的行会变得多么混乱。千万不要使用第二个脚本中的shell循环(如果输入一些文件内容,速度会非常慢,并且会完全破坏文件)来操作文本-UNIX shell是一个调用UNIX工具的环境,UNIX文本操作工具是awk,所以请使用它。你是一个了不起的人!我正在查找您键入的命令中的所有内容,以便更好地了解我在做什么。谢谢你帮助我!不客气,在做了一些初步研究之后,如果有任何问题,请随时提问。每个使用UNIX操作文本的人都应该购买Arnold Robbins的《有效的Awk编程》第四版。
awk -F'\t' '$1!=prev{close(out); out=$1".txt"; prev=$1} {sub(/[^\t]+\t/,""); print > out}' file