加入bash中的一些文件


-2

我有一个任务。我必须加入文件A:B.dsv,B:D.dsv和N:A.dsv。列由':'分隔。我必须加入关系N:D。

并按D排序结束文件

答: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

B: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

您可以使用2-3行来表明您希望最终输出看起来像什么?
bertieb

1
一些问题: - 1.中间文件应该是B:D.dsv吗?你用“N:D关系加入”是什么意思? 3.“按D排序结束文件”是什么意思?我要添加@ bertieb的评论。
AFH

Answers:


0

您的日期格式使排序更加困难。这是我认为你想要的:

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

没有皮尔的可能性吗?
diego9403

这是我学习的任务,在我们的课程中,我们没有用Perl编写。我想知道这种编程语言,但也许不是现在。所以你能告诉我在Perl中做这个程序的是什么吗?
diego9403

它按年份排序日期字段,然后是月份,然后是日期。我会提供另一种选择
glenn jackman

谢谢。但我有一个问题。 “ - ”是什么意思(排序)?
diego9403

许多unix命令执行此操作:它表示“从stdin读取”而不是从命名文件中读取。
glenn jackman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.