根据第一个文件中的行优先级的行号合并两个文件

时间:2017-02-15 18:24:28

标签: bash unix text

我在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

我该怎么做?

2 个答案:

答案 0 :(得分: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

请在此处阅读awkEffective AWK Programming

答案 1 :(得分: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,我们得到前两个冒号分隔的列。