比较&合并files-unix

时间:2012-06-29 18:50:58

标签: perl unix sed awk

cat file1.txt
Id    leng  sal   mon
25671 34343 56565 5565
44888 56565 45554 6868
23343 23423 26226 6224
77765 88688 87464 6848
66776 23343 63463 4534

cat file2.txt
Id     sp He Ho
25671  33 45 35
34353  64 75 33
77765  56 56 67

cat output.txt
Id     leng   sal  sp He Ho
25671  34343 56565 33 45 35
77765 88688  87464 56 56 67

比较file1.txt和amp; file2.txt,如果两个文件中的column1相同(file1.txt& file2.txt),则separte输出中的报告(output.txt)仅通过合并匹配一个(忽略file1.txt中的第4列,同时合并输出文件) )。

我试过cat file1.txt file2.txt | sort-u> output.txt。但它不起作用。任何使用连接的awk,技巧都很受欢迎。

3 个答案:

答案 0 :(得分:1)

awk 'NR==FNR{ s[$1] = $2 " " $3 }
     NR!=FNR{ if( $1 in s ) print $1, s[$1], $2,$3,$4}' file1.txt file2.txt

答案 1 :(得分:0)

join -o 0 1.2 1.3 2.2 2.3 2.4 <(sort file1.txt) <(sort file2.txt) |sort -n | tr ' ' '\t'

答案 2 :(得分:0)

这可能适合你(GNU sed):

cat <<\! >file1.txt
> Id    leng  sal   mon
> 25671 34343 56565 5565
> 44888 56565 45554 6868
> 23343 23423 26226 6224
> 77765 88688 87464 6848
> 66776 23343 63463 4534
> !
cat <<\! >file2.txt
> Id     sp He Ho
> 25671  33 45 35
> 34353  64 75 33
> 77765  56 56 67
> !
sed 's|^\(\S*\)\s*\(.*\)|/^\1/s/\\(\\(\\S*\\s*\\)\\{3\\}\\).*/\\1\2/p|' file2.txt
/^Id/s/\(\(\S*\s*\)\{3\}\).*/\1sp He Ho/p
/^25671/s/\(\(\S*\s*\)\{3\}\).*/\133 45 35/p
/^34353/s/\(\(\S*\s*\)\{3\}\).*/\164 75 33/p
/^77765/s/\(\(\S*\s*\)\{3\}\).*/\156 56 67/p
sed 's|^\(\S*\)\s*\(.*\)|/^\1/s/\\(\\(\\S*\\s*\\)\\{3\\}\\).*/\\1\2/p|' file2.txt |
sed -nf - file1.txt
Id    leng  sal   sp He Ho
25671 34343 56565 33 45 35
77765 88688 87464 56 56 67

说明:

file2.txt转换为将file1.txt转换为所需格式的sed脚本。