-1

У меня есть 5000 TXT-файлов с различными данными ниже этого. Мне нужен сценарий оболочки, чтобы скопировать только одну строку 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 ответа3

2

В зависимости от того, что вы считаете более последовательным, 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
0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .