我在1个目录中有很多平面文件。 每个文件都有一个标题和一些数据。 我想比较一个文件的标题与该目录中可用的所有其他文件。 这可以使用shell脚本来实现,但我想使用单行代码来实现。 我使用awk命令尝试了它,但它正在比较整个文件而不仅仅是标题。
for i in `ls -1 *a*` ; do cmp a.dat $i ; done
有人可以让我知道我该怎么做?
如果可以使用awk
来实现。
我只需要检查标头是否匹配。
答案 0 :(得分:2)
我会尝试这个:抓住每个文件的第一行,提取唯一的行,并计算它们。结果应该是一个。
number_uniq=$( sed '1q' * | sort -u | wc -l )
这不会告诉你哪个文件不同。
files=(*)
reference_header=$( sed '1q' "${files[0]}" )
for file in "${files[@]:1}"; do
if [[ "$reference_header" != "$( sed '1q' "$file" )" ]]; then
echo "wrong header: $file"
fi
done
答案 1 :(得分:0)
根据您的描述,您可以使用md5
或cksum
对标题中的字节进行签名。
给出5个文件(注意File 4.txt
不匹配):
$ for fn in *.txt; do echo "$fn:"; cat "$fn"; printf "\n\n"; done
File 1.txt:
what a great ride! it is a lovely day
/tmp/files/File 1.txt
File 2.txt:
what a great ride! it is a lovely day
/tmp/files/File 2.txt
File 3.txt:
what a great ride! it is a lovely day
/tmp/files/File 3.txt
File 4.txt:
what an awful ride! it is a horrible day
/tmp/files/File 4.txt
reference.txt:
what a great ride! it is a lovely day
/tmp/files/reference.txt
您可以使用md5
获取签名,并检查其他文件是否相同。
首先获得参考签名:
$ sig=$(head -1 reference.txt | md5)
$ echo $sig
549560de062a87ec69afff37abe18d8f
然后遍历文件:
for fn in *.txt; do
if [[ "$sig" != "$(head -1 "$fn" | md5)" ]]; then
echo "header of \"$fn\" does not match";
fi;
done
打印:
header of "File 4.txt" does not match