2017-02-15 6 views
0

私はUnix上にあり、ファイル内の行を置き換える必要があります。最初のファイルの行が優先される行番号に基づいて2つのファイルをマージする

私は、このファイル

1:F 
3:M 
5:Z 
7:Q 

を持っていると私は、最終的な結果は、この

1:F 
2:B 
3:M 
4:D 
5:Z 
6:F 
7:Q 
8:H 
9:I 
10:J 
11:K 
12:L 

のようになります

1:A 
2:B 
3:C 
4:D 
5:E 
6:F 
7:G 
8:H 
9:I 
10:J 
11:K 
12:L 

このファイルに:前の行を交換する必要がどのように私がする?

+0

質問を編集して[これまでに試したこと](http://whathaveyoutried.com)を表示してください。問題のあるコードの[mcve]を含める必要があります。次に、特定の問題を解決するために役立つことができます。 [ask]も読んでください。 –

+0

あなたは 'awk'で試しましたか?あなたは別のものを試しましたか? –

+0

私はsedを試しましたが、それを解決する理由が見つかりません – GgLaPoule

答えて

1

あなたはこのawkコマンドを使用することができます。

awk -F: 'FNR==NR{a[$1]=$2; next} $1 in a{$0 = $1 FS a[$1]} 1' file1 file2 

1:F 
2:B 
3:M 
4:D 
5:Z 
6:F 
7:Q 
8:H 
9:I 
10:J 
11:K 
12:L 

ここについてawkを読んでください:Effective AWK Programming

+0

@GgLaPoule:これはあなたのために機能しましたか? – anubhava

1

を短いファイルの行は、彼らが長いファイルに行かなければなられた順番である場合使用することができますjoincut

$ join --nocheck-order -a 2 -t ':' file1 file2 | cut -d ':' -f 1,2 
1:F 
2:B 
3:M 
4:D 
5:Z 
6:F 
7:Q 
8:H 
9:I 
10:J 
11:K 
12:L 

--nocheck-orderは、joinが入力ファイルが字句ではなく、ソートされていないことを無視します。 -a 2は、長いファイル(file2)から一致しない行も印刷します。 -t ':'は区切り文字をコロンに設定します。ちょうどjoinコマンドの出力は

1:F:A 
2:B 
3:M:C 
4:D 
5:Z:E 
6:F 
7:Q:G 
8:H 
9:I 
10:J 
11:K 
12:L 

cutであり、私たちは、この最初の2コロンで区切られた列を取得します。

関連する問題