Bashから2つのファイルを読み取るときに欠けているフィールドをどのように並べ替えて埋めることができますか?

Bashから2つのファイルを読み取るときに欠けているフィールドをどのように並べ替えて埋めることができますか?

2つのテキストファイルがあります

CatA.txt

10,1,1,"ABC"
10,1,2,"S1"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1,"S2"
10,2,1,"asd"
10,2,2,"S3"
10,2,2,"dkkd"
10,2,3,"ABC"

catB.txt

10,1,1,"ABC1"
10,1,2,"S1"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1,"asd"
10,2,2,"S3"
10,2,2,"dkkd"
10,2,4,"bokaj"

2つのテキストファイルを読み込んで不足しているフィールドを見つけ、「」で2つのファイルを不足しているフィールドで埋め、2つの新しい修正ファイルに保存したいと思います。このドアをどのように取得できますか?

A1.txtはA.txtの修正版です。

catA1.txt

10,1,1,"ABC"
10,1,2,"S1"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1,"S2"
10,2,1,"asd"
10,2,2,"S3"
10,2,2,"dkkd"
10,2,3,"ABC"
10,2,4,"  "

B1.txtはB.txtの修正版です。

catB1.txt

10,1,1,"ABC1"
10,1,2,"S1"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1,"  "
10,2,1,"asd"
10,2,2,"S3"
10,2,2,"dkkd"
10,2,3,"  "
10,2,4,"bokaj"

A1.txt の行の総数が B1.txt の行数と同じであることを確認します。私はbashを初めて使用するので、あなたの答えと説明が理解するのに多くの助けになるかもしれません。

これまでに試したMWEは次のとおりです。

#!/bin/bash


cut -d ',' -f1,2,3 A.txt > A1.txt
cut -d ',' -f1,2,3 B.txt > B1.txt


## Command to print contents which are in B1.txt but not in A1.txt

A=`awk 'NR==FNR{a[$0];next} !($0 in a)' A1.txt B1.txt`
echo $A,'" "' >> A.txt
sort A.txt

## Command to print contents which are in A1.txt but not in B1.txt

B=`awk 'NR==FNR{a[$0];next} !($0 in a)' B1.txt A1.txt`
echo $B,'" "' >> B.txt
sort B.txt

答え1

diffそれならsort ここで役に立つかもしれませんね。

例のように、ファイルA.txtB.txtその同伴アイテムA1.txt とファイルがすでに設定されている場合は、次の手順を実行します。B1.txt

diff --unchanged-line-format= --old-line-format= --new-line-format='%l,"  "'%c\'\\12\' A1.txt B1.txt | sort -st , -k 1,3 A.txt -

そして:

diff --unchanged-line-format= --old-line-format= --new-line-format='%l,"  "'%c\'\\12\' B1.txt A1.txt | sort -st , -k 1,3 B.txt -

これにより、説明する出力が生成されます。

答え2

grep -vFf B.txt A.txt | sed 's/".*"/" "/' |  sort -st, -k1,3 - B.txt

結果(B1.txt):

10,1,1," "
10,1,1,"ABC1"
10,1,2,"S1"
10,1,2,"ABC"
10,1,3,"baba"
10,2,1," "
10,2,1,"asd"
10,2,2,"S3"
10,2,2,"dkkd"
10,2,3," "
10,2,4,"bokaj"

ABC最初の行はあなたの例とは異なりますがABC1

関連情報