使用Awk或Cmp比较文件头

时间:2016-02-22 18:51:33

标签: bash shell awk

我在1个目录中有很多平面文件。 每个文件都有一个标题和一些数据。 我想比较一个文件的标题与该目录中可用的所有其他文件。 这可以使用shell脚本来实现,但我想使用单行代码来实现。 我使用命令尝试了它,但它正在比较整个文件而不仅仅是标题。

for i in `ls -1 *a*` ; do cmp a.dat $i ; done

有人可以让我知道我该怎么做? 如果可以使用awk来实现。

我只需要检查标头是否匹配。

2 个答案:

答案 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)

根据您的描述,您可以使用md5cksum对标题中的字节进行签名。

给出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