我有 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 行或最后一行,您可以分别使用sed
或tail
。我更喜欢它,sed
因为它可以更干净地处理多个文件,并确保包含行数较少的文件。因此,您只需要一个文件列表。如果它们都在同一个目录中,可以使用通配符来完成,如果find
它们嵌套在该目录中,则可以使用通配符。
因此,有find
和sed
:
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