Как извлечь конкретную строку из нескольких текстовых файлов в один текстовый файл на 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