Объединить 2-ю строку текстовых файлов вместе - PullRequest
1 голос
/ 07 марта 2019

У меня есть несколько сотен текстовых файлов по 2 строки в каждом.

Чтобы объединить их, я бы обычно делал:

cat *.txt > final.txt

однако мне нужно сделать это только для 2-й строкикаждого файла, поэтому окончательный вывод будет выглядеть как

2nd line of 1st file
2nd line of 2nd file
2nd line of 3rd file
(and so on..)

Есть идеи, как мне это сделать?

Ответы [ 5 ]

1 голос
/ 07 марта 2019

С GNU sed:

sed -n -s 2p *.txt > final.txt

или

sed -s '2!d' *.txt > final.txt

С man sed:

-s: рассматривать файлы как отдельные, а не каккак один непрерывный длинный поток.

1 голос
/ 07 марта 2019

1-е решение: Не могли бы вы попробовать следовать с GNU awk. nextfile - это очень хорошая опция в GNU awk, которая пропускает все строки в текущем Input_file, когда условие имеет значение MET.

awk 'FNR==2{print;nextfile}' *.txt > output_file


2-е решение: Если у вас нет GNU awk, попробуйте. Здесь, поскольку мы предполагаем, что в awk НЕТ nextfile, поэтому я создаю flag во второй строке каждого файла, а когда он ИСТИНА, просто перехожу на следующую строку / пропускаю их и пытаюсь когда-нибудь сохранить. Обратите внимание, что значение этого флага будет RESET и в первой строке каждого файла.

awk 'FNR==1{flag=""} FNR==2{print;flag=1} flag{next}'  *.txt > output_file


3-е решение: Добавление while и find также подходит здесь с head и tail. AFAIK голова и хвост не должны читать весь файл.

while read line
do
  head -n +2 "$line" | tail -1 
done <  <(find -type f -name "*.txt") > "output_file"
0 голосов
/ 08 марта 2019

Использование Perl

 perl -ne ' if($.==2) { print ; close(ARGV) } ' *.txt

с примерами файлов

$ cat allison1.txt
line1 in file1
line2 in file1

$ cat allison2.txt
line1 in file2
line2 in file2

$ cat allison3.txt
line1 in file3
line2 in file3

$  perl -ne ' if($.==2) { print ; close(ARGV) } ' allison*txt
line2 in file1
line2 in file2
line2 in file3

$
0 голосов
/ 07 марта 2019

Использование awk

awk 'FNR == 2 { print; nextfile }' *.txt > final.txt

FNR содержит номер строки в текущем файле. Когда он находится на строке 2, он напечатает строку и затем перейдет к следующему файлу.

0 голосов
/ 07 марта 2019
find . -name "*.txt" -type f -exec awk 'NR==2' {} \;
...