如何在 Linux 上将多个文本文件中的特定行提取到单个 txt 文件中?

如何在 Linux 上将多个文本文件中的特定行提取到单个 txt 文件中?

我有 5000 个 txt 文件,其中包含不同的数据。我需要一个 shell 脚本来仅将其中的第 11 行(最后一行)复制到一个文件中,然后按从小到大的顺序对它们进行排序。

例如:

文件1.txt

1KE5.pdb
USER_CHARGES
INVALID_CHARGES
@<TRIPOS>ATOM
ATOM      1  N   MET A   1   40.880  54.110  11.190  1.00  0.00
ATOM      8  HB1 MET A   1   38.760  53.510   9.880  1.00  0.00
ATOM      9  HB2 MET A   1   39.700  52.020   9.980  1.00  0.00
1            40.7               

文件2.txt

1KW5.pdb                     
USER_CHARGES                 
INVALID_CHARGES              
@<TRIPOS>ATOM                
ATOM      6  HA  MET A   1   39.020  54.080  12.120  1.00  0.00
ATOM      7  CB  MET A   1   39.050  52.700  10.580  1.00  0.00
ATOM      8  HB1 MET A   1   38.760  53.510   9.880  1.00  0.00
2            33.7               

文件3.txt

1KW5.pdb                     
USER_CHARGES                 
INVALID_CHARGES              
@<TRIPOS>ATOM                
ATOM      4  H3  MET A   1   40.580  54.900  10.580  1.00  0.00
ATOM      5  CA  MET A   1   39.750  53.360  11.780  1.00  0.00
ATOM      6  HA  MET A   1   39.020  54.080  12.120  1.00  0.00
3            54.2               

我需要的输出是:

最终版.txt

1       40.7
2       33.7
3       54.2

我需要一个脚本来解决这个问题。感谢您提供的任何帮助。

答案1

您可以使用find来获取输入文件、tail获取文件末尾以及sort对它们进行排序。例如:

find /path/to/ -name "file*.txt" -type f -exec tail -n1 {} \; | sort --numeric-sort --output output.txt

哪里/path/to/是您的文件的路径,file*.txt哪里是您的文件名的模式,-type f哪里是仅查找文件而不是目录,-n1哪里是告诉tail返回 1 行,哪里output.txt是输出文件。

答案2

根据您认为哪个更一致,第 11 行或最后一行,您可以分别使用sedtail。我更喜欢它,sed因为它可以更干净地处理多个文件,并确保包含行数较少的文件。因此,您只需要一个文件列表。如果它们都在同一个目录中,可以使用通配符来完成,如果find它们嵌套在该目录中,则可以使用通配符。

因此,有findsed

find /path/to/your/files -type f -name '*.txt' -exec sed -n 11p {} + >> output.txt

与 相同tail,请注意使用\;而不是+,以便分别处理每个文件:

find /path/to/your/files -type f -name '*.txt' -exec tail -n1 {} \; >> output.txt

或者也许是通配符:

sed -n 11p /path/to/your/files/*.txt >> output.txt

答案3

** 我需要一个 shell 脚本来复制...它们的最后一行到一个文件中,然后从小到大排序。

由于您的示例文件没有第 11 行,因此我根据您所述的“(最后一行)”进行工作。

  • 具有共同命名模式的多个文本文件。
  • 最后一行
  • 种类
  • 放置在文件中

收集最后几行并进行排序

$ tail -q -n 1 file*.txt | sort
1            40.7
2            33.7
3            54.2

并对结果进行排序,并将结果放入文件中

$ tail -q -n 1 file*.txt | sort > final.txt
$ cat final.txt
1            40.7
2            33.7
3            54.2

假设文件都在一个目录中。

如果文件位于一级子目录中,则更file*.txt改为*/file*.txt

如果文件位于不同深度的多个嵌套目录中,或者位于多个位置,则应使用find其他答案中描述的命令。

$ find . -name 'file*.txt' -exec tail -q -n 1 {} \; | sort
1            40.7
2            33.7
3            54.2

文件名可以包含空格,这曾经是一个问题。

$ ls -F *.txt
file1.txt  file2.txt  file three.txt  final.txt

相关内容