在bash循环中从文件中提取第n行

时间:2015-05-26 12:09:18

标签: linux bash loops awk

我想从文件中提取第n行并将其保存到新文件中。例如,我有index.txt:

cat index.txt

1   AAAGCGT
2   ACGAAGT
3   ACCTTGT
4   ATAATGT
5   AGGGTGT
6   AGCCAGT
7   AGTTCGT
8   AATGCAG
9   AAAGCGT
10  ACGAAGT

,输出应为

cat index.1.txt:

1   AAAGCGT
2   ACGAAGT

cat index.2.txt:

3   ACCTTGT
4   ATAATGT

cat index.3.txt:

5   AGGGTGT
6   AGCCAGT

等等..所以我想在循环中前两行提取表单输入文件并保存到新文件。

4 个答案:

答案 0 :(得分:4)

它并没有准确地给出你想要的名字,但是:

split -l 2 index.txt index. 

似乎是最简单的解决方案。它将创建名称以final参数开头的文件,因此将得到像' index.aa'这样的名称。和' index.bb'

答案 1 :(得分:4)

这只适用于任意数量的分组行,只需将2更改为3或您喜欢的任何数字:

$ awk 'NR%2==1{++i} {print > ("index." i ".txt")}' index.txt
$ ls index.?.txt
index.1.txt  index.2.txt  index.3.txt  index.4.txt  index.5.txt
$ tail index.?.txt
==> index.1.txt <==
1   AAAGCGT
2   ACGAAGT

==> index.2.txt <==
3   ACCTTGT
4   ATAATGT

==> index.3.txt <==
5   AGGGTGT
6   AGCCAGT

==> index.4.txt <==
7   AGTTCGT
8   AATGCAG

==> index.5.txt <==
9   AAAGCGT
10  ACGAAGT

答案 2 :(得分:3)

awk '{print >"index."(x+=NR%2)".txt"}' file

从1开始每两行增加x,然后将该行打印到具有该名称的文件

cat index.1.txt:

1   AAAGCGT
2   ACGAAGT

cat index.2.txt:

3   ACCTTGT
4   ATAATGT

cat index.3.txt:

5   AGGGTGT
6   AGCCAGT

在某些问题中,可能需要额外的parens,如下所示(由Ed Morton评论)

awk '{print >("index."(x+=NR%2)".txt")}' file

答案 3 :(得分:2)

我会说:

awk '{file=int((NR+1)/2)".txt"; print > file}' file

int((NR+1)/2映射每个行号:

1 --> 1
2 --> 1
3 --> 2
x --> (x+1) / 2

所以你得到这些文件:

$ cat 1.txt 
1   AAAGCGT
2   ACGAAGT

$ cat 3.txt 
5   AGGGTGT
6   AGCCAGT