2017-01-13 5 views
0

私は2つの.datファイルを持っています。まず、テキストID:名前と第2 ID:サイズです。 ID:name:sizeという3番目のファイルを作成する必要があります。 私は、端末の新ほとんどですし、私はこのようなものでした:次のアイデアがテキストでアップ書かれたのegrepと組み合わせるnew.dat「// S/$」sedの使用することですが、私はちょうどすることができますsedでgrep resultを使用する方法

#!/bin/bash 
egrep '[[:alnum:]]+:' file2.dat | sort > new.dat 
cat new.dat > file2.dat 
egrep '[[:alnum:]]+:' file1.dat | sort > new.dat 
cat new.dat > file1.dat 

while read -r line 
do 
    echo "$line" > temp 
    egrep -o ':[[:alnum:]]+' temp 
done < file2.dat 

をそれを得ない。

私の質問は、他の方法でこれを行うにはどうすればいいのですか、どうすればこのコマンドを組み合わせることができますか?

+1

をあなたにサンプル入力とそのサンプル入力のため、ご希望の出力を追加してください。質問。 – Cyrus

+0

入力形式はテキストで説明されています(ID:名前、ID:サイズ) – setempler

答えて

2

代わりに、bashとgrepのループを使用して、man joinを調べることができます。

File1.datの:

a:foo 
b:bar 
c:baz 

file2.dat:

a:1 
b:2 

実行:

join -t : file1.dat file2.dat

やジェームス・ブラウン(ソートされていないファイルのために)示唆として:

join -t : <(sort file1.dat) <(sort file2.dat)

取得する:

a:foo:1 
b:bar:2 
+0

ありがとう、これは動作します:) – Princo

+0

歓迎!一致しない行を追加する必要がある場合は、引数 '-a'を調べてください。 – setempler

+2

' join 'を使用するときにファイルをソートする必要があることに注意してください。もしそうでなければ、 '-t:<(sort file1.dat)<(sort file2.dat)'に参加することができます。 –

1

は、ここではawkでの一つだ:

$ awk -F':' '$1 in a{print a[$1] FS $2;next}{a[$1]=$0}' f1 f2 
a:foo:1 
b:bar:2 

を説明:

awk -F':' '    # use : as field separator 
$1 in a {    # if key in the first field has already been seen 
    print a[$1] FS $2; # output corresponding array (=record from f1) and $2 of f2 
    next }    # no need to process this record further, skip to next 
{ 
    a[$1]=$0   # store record from f1 to hash a using first field as a key 
}' f1 f2 
関連する問題