Shell 在Unix中匹配文件字符串

Shell 在Unix中匹配文件字符串,shell,unix,ksh,Shell,Unix,Ksh,我在$files\u DIR目录下有3个文件 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_c

我在$files\u DIR目录下有3个文件

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 -1 File_Apple.txt >> new_file.txt
head -1 File_Samsung.txt >> new_file.txt
head -1  File_Huwaei.txt >> new_file.txt
基本上,我必须根据head_config.txt文件匹配文件的标题是否正确

我可以通过一些繁琐的流程来实现: 分别复制每个文件的标题行并附加到新文件。然后比较用head.config.txt创建的新文件

AAA1,BBB2,CCC3
DDD1,EEE2
FFF1,GGG2,HHH3,III4
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

AAA1,BBB2,CCC3
DDD1,EEE2
FFF1,GGG2,HHH3,III4
head -1 File_Apple.txt >> new_file.txt
head -1 File_Samsung.txt >> new_file.txt
head -1  File_Huwaei.txt >> new_file.txt

如何更有效地执行此操作?

首先,确保头文件中的行按文件名的字母顺序排序。因此head_config.txt变为:

AAA1,BBB2,CCC3
FFF1,GGG2,HHH3,III4
DDD1,EEE2AAA1,BBB2,CCC3
然后执行以下命令:

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

diff-head\u-config.txt这里有一个命令可以完成这一切,为匹配的每个文件打印
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\u config.txt
    ,它将每一行读入数组
    dhr

  • 打印文件名,(hdr[++i]=$0?“好”:“坏”);下一个文件

    对于剩余的每个文件,这将检查其第一行是否与
    hdr
    的相应元素匹配:
    hdr[++i]==$0
    。如果没有,则打印文件名和
    Good
    。否则,将打印文件名和
    Bad

    • 用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
      

      这并不是真的“麻烦”。我唯一的建议是使用for循环文件,以防最后的结果是30个文件而不是3个文件-这会很麻烦;-)期望的输出是什么?”“是”或“否”表示所有文件都100%匹配?具有匹配标头的文件列表?没有匹配头的文件列表?多个文件是否可以具有相同的头文件?如果是,头文件是否会在
      head\u config.txt
      中显示一次或多次?@John3136:谢谢!我同意循环是必需的,因为文件数量可能会增加。@markp:输出可以是任何内容。是或否,好或坏。多个文件可以有一些相同的标题。谢谢John!这真的很有帮助。AWK确实非常有用。