在 Unix 中匹配文件字符串
Match strings of files in Unix
我在 $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 个文件的 header 行。
head_config.txt
AAA1,BBB2,CCC3
DDD1,EEE2
FFF1,GGG2,HHH3,III4
基本上我必须根据 head_config.txt 文件
匹配文件的 headers 是否正确
我可以通过一些繁琐的过程来做到这一点:
分别复制每个文件的 header 行并附加到新文件。然后比较用 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
我怎样才能更有效地做到这一点?
首先,确保头文件中的行按 文件名 的字母顺序排序。所以 head_config.txt 变成:
AAA1,BBB2,CCC3
FFF1,GGG2,HHH3,III4
DDD1,EEE2AAA1,BBB2,CCC3
然后执行这条命令:
diff head_config.txt <(head -q -n1 File_*)
如果文件匹配,则不会有输出,$?
将是0
。
这是一个完成所有操作的命令,为每个匹配的文件打印 Good
,为不匹配的文件打印 Bad
:
$ awk 'FNR==NR{hdr[NR]=[=10=];next} {print FILENAME, (hdr[++i]==[=10=]?"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]=[=13=];next}
对于第一个文件 head_config.txt
,这会将每一行读入数组 dhr
。
print FILENAME, (hdr[++i]==[=16=]?"Good":"Bad"); nextfile
对于每个剩余的文件,这将检查其第一行是否与 hdr
的相应元素相匹配:hdr[++i]==[=18=]
。如果是,则打印文件名和 Good
。否则,打印文件名和 Bad
。
用 AWK 检查这个
for file in ./File_*
do
for line in `cat head_config.txt`
do
awk -v var="$line" '[=10=] ~ var && NR==1 {print FILENAME "PASSED TEST"}' $file
done
done
我在 $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 个文件的 header 行。
head_config.txt
AAA1,BBB2,CCC3
DDD1,EEE2
FFF1,GGG2,HHH3,III4
基本上我必须根据 head_config.txt 文件
匹配文件的 headers 是否正确我可以通过一些繁琐的过程来做到这一点: 分别复制每个文件的 header 行并附加到新文件。然后比较用 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
我怎样才能更有效地做到这一点?
首先,确保头文件中的行按 文件名 的字母顺序排序。所以 head_config.txt 变成:
AAA1,BBB2,CCC3
FFF1,GGG2,HHH3,III4
DDD1,EEE2AAA1,BBB2,CCC3
然后执行这条命令:
diff head_config.txt <(head -q -n1 File_*)
如果文件匹配,则不会有输出,$?
将是0
。
这是一个完成所有操作的命令,为每个匹配的文件打印 Good
,为不匹配的文件打印 Bad
:
$ awk 'FNR==NR{hdr[NR]=[=10=];next} {print FILENAME, (hdr[++i]==[=10=]?"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]=[=13=];next}
对于第一个文件
head_config.txt
,这会将每一行读入数组dhr
。print FILENAME, (hdr[++i]==[=16=]?"Good":"Bad"); nextfile
对于每个剩余的文件,这将检查其第一行是否与
hdr
的相应元素相匹配:hdr[++i]==[=18=]
。如果是,则打印文件名和Good
。否则,打印文件名和Bad
。
用 AWK 检查这个
for file in ./File_*
do
for line in `cat head_config.txt`
do
awk -v var="$line" '[=10=] ~ var && NR==1 {print FILENAME "PASSED TEST"}' $file
done
done