Как извлечь конкретную строку из нескольких текстовых файлов в один текстовый файл на Linux?

У меня есть 5000 текстовых файлов с различными данными ниже этого. Мне нужен сценарий оболочки, чтобы скопировать только одну строку 11 (последнюю строку) из них в один файл и отсортировать их от наименьшего к наибольшему.

например:

file1.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               

file2.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               

file3.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               

Мне нужно, чтобы вывод был:

final.txt

1       40.7
2       33.7
3       54.2

Мне нужен скрипт для решения этой проблемы. Спасибо за любую помощь, которую вы можете оказать.

3 ответа

Решение

Ты можешь использовать 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 это выходной файл

В зависимости от того, что вы считаете более последовательным, 11-ю строку или последнюю строку, вы можете использовать либо sed или же tailсоответственно. я бы предпочел sed поскольку он обрабатывает несколько файлов более аккуратно, а также обеспечивает включение файлов с меньшим количеством строк. Итак, тогда вам просто нужен список ваших файлов. Это может быть сделано с помощью globbing, если они все находятся в одном каталоге, или с 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

** Мне нужен сценарий оболочки только для копирования... последней строки из них в один файл и сортировки их от наименьшего к наибольшему.

Поскольку в ваших файлах примеров нет строки 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
Другие вопросы по тегам