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

2246
H. aryapour

У меня есть 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 

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

-1
если строка, которую вы хотите, всегда последняя, ​​вы всегда можете `tail -n 1 filename >> output.txt` для каждого файла. оберните его в команду find, которая знает, как выбрать 5000 файлов, и это должно быть довольно просто. Frank Thomas 7 лет назад 1
Обратите внимание, что [SU] не является сервисом написания скриптов. Если вы сообщите нам, что вы уже пробовали (включая сценарии, которые вы используете) и где вы застряли, мы можем попытаться помочь с конкретными проблемами. Вам также следует прочитать [Как мне задать хороший вопрос?] (Http://superuser.com/help/how-to-ask). DavidPostill 7 лет назад 2

3 ответа на вопрос

2
DKing

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

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

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

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

Спасибо всем за помощь, это работает, но значения начинаются со столбца 7, с десятичными после чисел (например, 1.000 2.000 3.0000) в выходном файле. Я хочу, чтобы записывались значения из первого столбца без нулевых цифр. H. aryapour 7 лет назад 0

Похожие вопросы