![在bash中加入一些文件](https://linux22.com/image/1464470/%E5%9C%A8bash%E4%B8%AD%E5%8A%A0%E5%85%A5%E4%B8%80%E4%BA%9B%E6%96%87%E4%BB%B6.png)
我有一项任务。我必须连接文件 A:B.dsv、B:D.dsv 和 N:A.dsv。列以“:”分隔。我必须通过关系 N:D 进行连接。
并按 D 排序结束文件。
A:B.dsv:
R0X 7M3:48B56
L6R 5X3:08P68
E1W 4Q1:26N92
E2O 5I3:10F41
H2S 6G2:24W77
P6A 9S0:12D69
B9B 0K3:83U99
N1H 5L4:21P31
D0T 3W4:02F82
Y8A 2B7:08O10
J7B 8T3:05P26
A7P 7U4:39M76
M7D 5I8:58J55
O2E 1I9:42U04
G2I 0V1:43S37
F0Y 0P6:07I98
X0E 2N0:20S71
M0K 2P2:86R47
O0E 5G3:78J91
C5W 4V0:02F49
J0G 2A1:56Z45
V9Z 1S8:56Z27
C8K 4T8:58O04
Q0U 4K8:98H68
Z3K 4R3:94A07
乙:D:
10F41:26.01.14
39M76:30.03.12
83U99:28.11.12
58J55:30.03.12
86R47:28.11.12
21P31:03.04.12
56Z45:03.04.12
94A07:13.05.13
05P26:28.11.12
02F49:26.01.14
56Z27:13.05.13
20S71:28.11.12
08P68:30.03.12
24W77:26.01.14
12D69:03.04.12
26N92:03.04.12
98H68:13.05.13
78J91:03.04.12
02F82:13.05.13
58O04:30.03.12
08O10:26.01.14
48B56:26.01.14
07I98:30.03.12
43S37:28.11.12
42U04:13.05.13
N:A.dsv:
Zia:C5W 4V0
Moana:E2O 5I3
Grace:G2I 0V1
Moana:A7P 7U4
Joy:F0Y 0P6
Grace:O0E 5G3
Cameran:Q0U 4K8
Cameran:J0G 2A1
Zia:J7B 8T3
Grace:M0K 2P2
Cameran:L6R 5X3
Zia:O2E 1I9
Cameran:Y8A 2B7
Joy:D0T 3W4
Moana:Z3K 4R3
Joy:N1H 5L4
Grace:R0X 7M3
Cameran:E1W 4Q1
Moana:M7D 5I8
Zia:B9B 0K3
Grace:C8K 4T8
Moana:P6A 9S0
Joy:V9Z 1S8
Zia:H2S 6G2
答案1
您的日期格式使排序变得有点困难。我认为您想要的是:
join -t : -1 2 -2 1 <(sort -t: -k2 A:B.dsv) <(sort B:D.dsv) |
join -t : -j 2 -o 2.1,1.3 <(sort -t: -k2 -) <(sort -t: -k2 N:A.dsv) |
perl -E '
chomp(@lines = <>);
say join "\n",
map {$_->[1]}
sort {$a->[0] <=> $b->[0]}
map {@d = split /[.]/, (split /:/)[1]; [ $d[2].$d[1].$d[0], $_ ]}
@lines
'
输出:
Moana:30.03.12
Grace:30.03.12
Joy:30.03.12
Cameran:30.03.12
Moana:30.03.12
Camerawk 'BEGIN {FS=OFS=":"} {print $2,$1}'an:03.04.12
Cameran:03.04.12
Joy:03.04.12
Grace:03.04.12
Moana:03.04.12
Zia:28.11.12
Grace:28.11.12
Zia:28.11.12
Grace:28.11.12
Joy:13.05.13
Zia:13.05.13
Cameran:13.05.13
Joy:13.05.13
Moana:13.05.13
Zia:26.01.14
Moana:26.01.14
Zia:26.01.14
Grace:26.01.14
Cameran:26.01.14
我可以花很多时间来分解它,但会试验管道的每个部分,看看它是如何构建的。
没有 perl:
join -t : -1 2 -2 1 <(sort -t: -k2 A:B.dsv) <(sort B:D.dsv) |
join -t : -j 2 -o 1.3,2.1 <(sort -t: -k2 -) <(sort -t: -k2 N:A.dsv) |
sort -t. -k3,3n -k2,2 -k1,1 |
awk 'BEGIN {FS = OFS = ":"} {print $2,$1}'
第二个连接打印 D:N 关系,按日期排序,然后使用 awk 反转字段。附加的副作用是输出也按名称排序。
Cameran:30.03.12
Grace:30.03.12
Joy:30.03.12
Moana:30.03.12
Moana:30.03.12
Cameran:03.04.12
Cameran:03.04.12
Grace:03.04.12
Joy:03.04.12
Moana:03.04.12
Grace:28.11.12
Grace:28.11.12
Zia:28.11.12
Zia:28.11.12
Cameran:13.05.13
Joy:13.05.13
Joy:13.05.13
Moana:13.05.13
Zia:13.05.13
Cameran:26.01.14
Grace:26.01.14
Moana:26.01.14
Zia:26.01.14
Zia:26.01.14
排序将是很多如果使用标准日期格式 YYYY-MM-DD 会更容易:
join -t : -1 2 -2 1 <(sort -t: -k2 A:B.dsv) <(sort B:D.dsv) |
join -t : -j 2 -o 2.1,1.3 <(sort -t: -k2 -) <(sort -t: -k2 N:A.dsv) |
sort -t: -k2