【问题标题】:Extract n-th line from file in bash loop在bash循环中从文件中提取第n行
【发布时间】:2015-05-26 12:09:18
【问题描述】:

我想从文件中提取第 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

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

【问题讨论】:

  • 首先向我们展示您已经尝试过的代码,然后也许有人可以帮助您。
  • 对不起,我的代码可能类似于 - for i in index.txt do head -4 $i;完成;

标签: linux bash loops awk


【解决方案1】:

它并没有给你准确的名字,但是:

split -l 2 index.txt index. 

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

【讨论】:

  • 假设 GNU coreutils,split -l 2 -a 1 --numeric-suffixes=1 --additional-suffix=.txt index.txt index. 将给出与问题中相同的名称。
  • 非常感谢,这很简单,而且效果很好。 @Wintermute 感谢您在命名方面的帮助!
【解决方案2】:

只需将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

【讨论】:

    【解决方案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
    

    在某些 awk 中,可能需要额外的括号,如下所示(由 Ed Morton 评论)

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

    【讨论】:

    • 使用我最喜欢的 awk 的非常好的解决方案!!谢谢分享!
    • 它在某些 awk 中会失败,因为输出重定向右侧的未加括号的表达式是未定义的行为。您需要将创建输出文件名的表达式括起来:print &gt;("index."(x+=NR%2)".txt")
    【解决方案4】:

    我会说:

    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
    

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2012-03-27
      • 2021-10-02
      相关资源
      最近更新 更多