Shell 在Unix中匹配文件字符串
我在$files\u DIR目录下有3个文件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
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确实非常有用。