2017-02-15 53 views
0

我在Unix上,我需要替換文件中的行。根據行號合併兩個文件,其中第一個文件的行優先

我有這個文件

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

,我需要更換:前行到該文件

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

最後的結果應該是這樣的

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

哪有我這樣做?

+0

請[編輯]你的問題,以顯示[你迄今爲止嘗試過的](http://whathaveyoutried.com)。您應該包含您遇到問題的代碼[mcve],然後我們可以嘗試幫助解決特定問題。你還應該閱讀[問]。 –

+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,我們得到的這前兩個冒號分隔列。

相關問題