2つのファイルがあります。
File1 File2
abc abc
cde cde,xyz,efg,hij,...,n
efg lmn,opq,weq,...n
今比較したいです。ファイル1行1そしてファイル2行1、2号線そして2号線など。ただし、File2では、単一行に「カンマ」で区切られた複数の項目を含めることができます。
今入ってみるとファイル1対応する行項目と一致します。ファイル2結果は良いでしょう。それ以外の場合は違いが表示されます。
たとえば、
File1 File2
cde cde,xyz,efg,hij,opt
cde
両方のファイルに結果があるため、結果は良好でなければなりません。
アイテムの違いを含むdiffなどのシェルスクリプトを書くのに役立ちますか?
答え1
きれいではないかもしれませんが、次のようなものが始まるかもしれません。
# 1. Read lines from file1 as string, and file2 as comma-separated array.
while read -r a && IFS=, read -ra b <&3; do
# 2. If both empty lines, continue.
if [[ "$a" == "" && ${#b[@]} == 0 ]]; then
continue
fi
# 3. Start assuming diff.
diff=1
# 4. Loop fields in $b.
for e in ${b[@]}; do
# Compare field in $b with $a, if match then abort.
if [[ "$e" == "$a" ]]; then
diff=0
break
fi
done
# 5. If no match found, print line from $b.
if [[ $diff == 1 ]]; then
# Join array with <space>comma.
line=$(printf ", %s" "${b[@]}")
# Print line, excluding leading <space>comma.
printf "%s\n" "${line:2}"
fi
# Input argument one as file 1 to stdin, and argument two as file 2 to
# file descriptor 3.
done < "$1" 3<"$2"
通常、次のように使用されます。
$ ./myscript file1 file2
今、Python、Perl、awkなどを使用する方が良いでしょう。
答え2
答え3
努力する:
paste file1 file2 | grep -vP '^(.*)\t.*\1.*'
また、状況に合わせて正規表現を調整することもできます。
答え4
GNU awkを使用すると、1行にできます。
awk '{a=$0;getline <File2;if($0 ~ a)print "OK"; else print a,$0}' File1