Соответствие строк файлов в Unix - PullRequest
3 голосов
/ 05 октября 2019

У меня есть 3 файла в каталоге $ FILES_DIR

1) File_Apple.txt
2) File_Samsung.txt
3) File_Huwaei.txt

Header rows of File_Apple.txt

    AAA1,BBB2,CCC3

Header rows of File_Samsung.txt

    DDD1,EEE2

Header rows of File_Huwaei.txt

    FFF1,GGG2,HHH3,III4

Есть еще один файл с именем head_config, который содержит строку заголовка 3 вышеуказанных файлов.

head_config.txt

AAA1,BBB2,CCC3
DDD1,EEE2
FFF1,GGG2,HHH3,III4

По сути, я должен соответствовать, если заголовки файла правильны согласно файлу head_config.txt

Я могу сделать это с помощью некоторого громоздкого процесса: копировать строки заголовков каждого файла по отдельности идобавление в новый файл. Затем сравнивая новый файл, созданный с head.config.txt

head -1 File_Apple.txt >> new_file.txt
head -1 File_Samsung.txt >> new_file.txt
head -1  File_Huwaei.txt >> new_file.txt

Затем cmp new_file.txt с head_config.txt

Как я могу сделать это более эффективно?

Ответы [ 3 ]

2 голосов
/ 05 октября 2019

Сначала убедитесь, что строки в вашем заголовочном файле отсортированы в алфавитном порядке по filename . Таким образом, head_config.txt становится:

AAA1,BBB2,CCC3
FFF1,GGG2,HHH3,III4
DDD1,EEE2AAA1,BBB2,CCC3

Затем выполните эту команду:

diff head_config.txt <(head -q -n1 File_*)

Если файлы совпадают, выходных данных не будет, и $? будет 0.

1 голос
/ 05 октября 2019

Проверьте это с AWK

for file in ./File_*
do
  for line in `cat head_config.txt`
  do
    awk -v var="$line" '$0 ~ var && NR==1 {print FILENAME "PASSED TEST"}' $file
  done
done
1 голос
/ 05 октября 2019

Вот одна команда, которая делает все это, печатая Good для каждого файла, который соответствует, и Bad для тех, которые не соответствуют:

$ awk 'FNR==NR{hdr[NR]=$0;next} {print FILENAME, (hdr[++i]==$0?"Good":"Bad"); nextfile}' head_config.txt File_Apple.txt File_Samsung.txt File_Huwaei.txt 
File_Apple.txt Good
File_Samsung.txt Good
File_Huwaei.txt Good

Вывод довольно гибкий и может бытьизменено для удовлетворения ваших особых потребностей.

Как это работает

  • NR==NR{hdr[NR]=$0;next}

    Для первого файла, head_config.txt, это читаетсякаждая строка в массиве dhr.

  • print FILENAME, (hdr[++i]==$0?"Good":"Bad"); nextfile

    Для каждого из оставшихся файлов эта проверка проверяет, соответствует ли его первая строка соответствующему элементуhdr: hdr[++i]==$0. Если это так, имя файла и Good будет напечатано. В противном случае печатаются имя файла и Bad.

...