2016-08-16 11 views
-2

は、私は次のような値を持っている巨大なFILE1を、持っています:はsedを、awkを使って特定のフィールドを交換するか、任意のPOSIXツール

a:2543:2524:2542:252:536365:54654 
c:5454:5454:654:54:87:54 
d:87:65:1:98:32:87 

私はファイル1の変数の行を検索し、次のように出力する必要がありますので、FILE2で7列にその値を置き換えたい:

a:2543:2524:2542:252:536365:1 
c:5454:5454:654:54:87:3 
d:87:65:1:98:32:4 
+1

試したコード/スクリプトはありますか?本当に 'file1'はそれが見えるように単純ですか?あなたは私たちがあなたのコードを書くことを期待していませんか? – Jdamian

+0

何と置き換えますか? 'file1'は' a'から '1'にマッピングされていますか?もしそうなら、なぜ' 54654'は '1'に置き換えられますか? –

+0

ああ、私は見る - 'file2'の最初の列によると? –

答えて

0

としてだから私は解決策を考え出したていると仮定すると、動作します。コードのいくつかの行で終わった。多分もっと良い方法があります。しかし、これはうまくいきます!

while read line ; do 
    var1=`echo $line| awk '{print $1}'` 
    var2=`echo $line| awk '{print $2}'` 
    awk -v var1="$var1" -v var2="$var2" -F ':' 'BEGIN { OFS = ":"} $1==var1 {sub(".*",var2,$7)}{print}' file2 > file2.tmp 
    mv file2.tmp file2 
done < file1 
cat file2 
+0

'read-r var1 var2 _'で' read line'を置き換える方がずっと効率的です。 (もちろん、行ごとに1回呼び出すのではなく、すべての作業をawkで1つだけ行うのは*よりも良いでしょうが、それは別の問題です)。 –

0

多分これawkファイルが掲載さ

awk -F: 'NR==FNR{a[$1]=$0;next;}a[$1]{$0=a[$1]}1' file1 file2 
a:2543:2524:2542:252:536365:1 
c:5454:5454:654:54:87:3 
d:87:65:1:98:32:4 
+0

残念ながら、それは私のために働いていませんでしたが、私は以下に投稿した解決策を考え出しました。 –

0

これは動作するはずです - それは、両方のファイルが最初の列でソートされていると仮定し - 速度とメモリの両方 - - 私は非常に大きなファイルのためのソリューションを持つ任意のパフォーマンスの比較に非常に興味があると思い--complementは、Linuxであります特有ですが、使用できない場合は簡単に置き換えます。

file0=$1 #file with single value 
file1=$2 #file with 6th value to be replaced 
# normalize on colon delimiter 
tr ' ' : <$file0| 
# join on first field 
join -t: $file1 -| 
# delete column 7 
cut --complement -d: -f7 
+0

あなたの展開を引用することを検討したいと思います。ソート制約を保証するには '<(sort" $ file1 ")'と '<(sort" $ file0 ")'を使うとよいでしょう。 –

関連する問題