2016-04-08 11 views
0

私は2つのファイルを結合し、そして1つのファイルにまとめたい[のみ2フィールド($4FILE A$5$2FILE B$3)は、2つのファイル間の共通のものです]。以下の希望の出力を参照してください。bashスクリプトを使用して2つのテキストファイルを結合するにはどうすればよいですか?

FILEのA:

X 2134 101L 12345.00 22222.00 1 10 

X 2134 101L 12345.00 22222.00 11 20 

X 2134 101L 12345.00 22222.00 21 30 

X 2134 111L 77777.00 22222.00 1 10 

X 2134 111L 77777.00 22222.00 11 20 

X 2134 111L 77777.00 22222.00 21 30 

X 2134 121L 56347.00 46678.00 1 10 

X 2134 121L 56347.00 46678.00 11 20 

X 2134 121L 56347.00 46678.00 21 3 

FILE B:

3333 12345 22222 54367.05 34765.05 

3333 34567 12235 54298.05 34568.05 

3333 77777 22222 52765.05 32567.05 

3333 55555 11111 52875.05 36547.05 

3333 56347 46678 53789.05 34566.05 

結果:

3333 2134 10 12345 22222 54367.05 34765.05 

3333 NA NA 34567 12235 54298.05 34568.05 

3333 2134 11 77777 22222 52765.05 32567.05 

3333 NA NA 55555 11111 52875.05 36547.05 

3333 2134 12 56347 46678 53789.05 34566.05 

HIみんな、 私は1枚の絵を追加し、私はそれがうまく私の要件を記述ことを願っています。ありがとう the desired output

+4

にあなたのパイプZulan&H.Rの場合:[編集ヘルプ](http://stackoverflow.com/editing-help)をご覧ください。 – Cyrus

+0

@Cyrusあなたがあなたの批判にもっと具体的になりうるのであれば、私は感謝します。私は通常、書式化されたテキストをコードやブロッククォートに使用します。その場合、書式設定済みのテキストがより適切であると思います。 – Zulan

+2

空白の行と接頭辞の行を4つの空白で削除することをお勧めします。 – Cyrus

答えて

0

下のスクリプトは、上記の場合に動作します。

while read line 
do 
value1=`echo $line |awk '{print $1}'` 
value2=`echo $line |awk '{print $2}'` 
value4=`echo $line |awk '{print substr($0, index($0,$3))}'` 
value3=`grep $value2 fileA.txt|head -n 1|awk '{print $2" "$3}'|sed 's/1L//'` 
if [ "$value3" == "" ];then 
echo $value1" NA NA "$value4 >> result.txt 
else 
echo $value1" "$value3" "$value2" "$value4 >> result.txt 
fi 

done<fileB.txt 

出力:

3333 2134 10 12345 22222 54367.05 34765.05 
3333 NA NA 12235 54298.05 34568.05 
3333 2134 11 77777 22222 52765.05 32567.05 
3333 NA NA 11111 52875.05 36547.05 
3333 2134 12 56347 46678 53789.05 34566.05 

PS:代わりに、SHのはbashを使用して、このスクリプトを実行します。

0

awkレスキュー!あなたが複数の一致があるFILEAからの最初の試合をしたい

$ awk 'NR==FNR{$4=$4+0;$5=$5+0; 
       if(!(($4,$5) in a)) a[$4,$5]=$2 FS $7;;next} 
       {$2=((($2,$3) in a)?a[$2,$3]:"NA" FS "NA") FS $2}1' file{A,B} 

3333 2134 10 12345 22222 54367.05 34765.05 
3333 NA NA 34567 12235 54298.05 34568.05 
3333 2134 10 77777 22222 52765.05 32567.05 
3333 NA NA 55555 11111 52875.05 36547.05 
3333 2134 10 56347 46678 53789.05 34566.05 

、フィールドのフォーマットは、両方のファイル(整数対小数点)に一致していません。

... | column -t

3333 2134 10 12345 22222 54367.05 34765.05 
3333 NA NA 34567 12235 54298.05 34568.05 
3333 2134 10 77777 22222 52765.05 32567.05 
3333 NA NA 55555 11111 52875.05 36547.05 
3333 2134 10 56347 46678 53789.05 34566.05 
+0

私はOPがbashソリューションを探していたと思っています...でも、コードは含まれていないので、質問は閉じなければなりません。 – ghoti