用于连接两个文件的shell脚本


8

我想编写一个shell script获取两个文件A和的文件B,并得到如下结果:

档案A

user_a tel_a addr_a
user_b tel_b addr_b

档案B

process_1 user_a
process_2 user_a
process_3 user_b

结果:

user_a process_1 tel_a addr_a
user_a process_2 tel_a addr_a
user_b process_3 tel_b addr_b

我怎样才能做到这一点?awk或者是其他东西?


2
我认为可以使用cutpaste仅完成此操作,但我无法正确使用合奏。
伯恩哈德'02

我的文件有很多记录和字段,我无法剪切和粘贴!这只是一个示例。
纳维德·法哈迪

1
@NavidFarhadi未剪切并粘贴:有两个实际命令cut,请paste查看其手册页。
Matteo

我可以将两个文件完全加载到内存中,也可以使用awk。
纳维德·法哈迪

如果它们在linux命令行中是可执行的,我也可以使用perl或其他。
纳维德·法哈迪

Answers:


15

join ...

join -1 2 -2 1 FileB FileA

输出量

user_a process_1 tel_a addr_a
user_a process_2 tel_a addr_a
user_b process_3 tel_b addr_b

输入文件需要按关键字段排序。您的示例文件已经排序,因此没有必要,但是您可以按照以下方式合并排序。

join -1 2 -2 1 <(sort -k2 FileB) <(sort FileA)

数字参数是什么意思?
纳维德·法哈迪

5
@Navid:您可以随时指的的得到一个命令的PARAMATERS的最好和最准确的描述手动,通过输入man join到终端的命令行... -1 2   -2 1 手段:加入的“1号文件第二场”'第二个文件1场”
Peter.O

3

由于joinpaste并非在任何地方都可用(例如,它们不在我基于BusyBox的系统上),因此请按照以下方法使用awk进行操作:

awk 'BEGIN {
    while( (getline < "fileA") > 0) A[$1]=$2 OFS $3 # read fileA into the array A
    close("fileA")
  } {
    print $2, $1, A[$2]
  }' fileB

顺便说一句,您错过了分隔符A[$1]=$2 OFS $3...这是另一个避免在BEGIN中进行手动循环的变体,但它与awk几乎相同,尽管它确实为第二个文件引入了其他不必要的条件测试:awk 'NR==FNR {A[$1]=$2 OFS $3;next} {print $2, $1, A[$2]}' fileA fileB...(+ 1)
Peter.O 2012年
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.