【问题标题】:Match strings of files in Unix匹配 Unix 中的文件字符串
【发布时间】:2019-10-04 23:44:20
【问题描述】:

我在 $FILES_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_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

我怎样才能更有效地做到这一点?

【问题讨论】:

  • 这并不是真的“麻烦”。我唯一的建议是文件的 for 循环,以防你最终得到 30 而不是 3 - 这会很麻烦;-)
  • 期望的输出是什么? “是”或“否”,您在所有文件中都 100% 匹配?具有匹配标题的文件列表?没有匹配标题的文件列表?多个文件是否可以具有相同的标题,如果是,标题是否会在 head_config.txt 中显示一次或多次?
  • @John3136:谢谢!我同意循环是必需的,因为文件数量可能会增加。
  • @markp:输出可以是任何东西。是或否。好或坏。多个文件可以有一些相同的标题。

标签: shell unix ksh


【解决方案1】:

首先,确保头文件中的行按文件名的字母顺序排序。所以 head_config.txt 变成了:

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

然后执行这个命令:

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

如果文件匹配,则不会有输出,$? 将是0

【讨论】:

    【解决方案2】:

    这是一个可以完成所有工作的命令,为每个匹配的文件打印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

    【讨论】:

    • 谢谢约翰!这真的很有帮助。 AWK 确实很有用。
    【解决方案3】:

    用 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
    

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多