如何在两个文件的匹配列的基础上find列的值?

文件1:emp.txt

7839|KING|PRESIDENT||17-Nov-81|5000||10 7698|BLAKE|MANAGER|7839|01-May-81|2850||30 7782|CLARK|MANAGER|7839|09-Jun-81|2450||10 7566|JONES|MANAGER|7839|02-Apr-81|2975||20 7788|SCOTT|ANALYST|7566|19-Apr-87|3000||20 7902|FORD|ANALYST|7566|03-Dec-81|3000||20 7369|SMITH|CLERK|7902|17-Dec-80|800||20 7499|ALLEN|SALESMAN|7698|20-Feb-81|1600|300|30 7521|WARD|SALESMAN|7698|22-Feb-81|1250|500|30 7654|MARTIN|SALESMAN|7698|28-Sep-81|1250|1400|30 

文件2:dept.txt

  10|ACCOUNTING|NEW YORK 20|RESEARCH|DALLAS 30|SALES|CHICAGO 40|OPERATIONS|BOSTON 

我想打印下面的输出:

 7839|KING|PRESIDENT||17-Nov-81|5000||10|NEW YORK 7698|BLAKE|MANAGER|7839|01-May-81|2850||30|CHICAGO 7782|CLARK|MANAGER|7839|09-Jun-81|2450||10|NEW YORK 7566|JONES|MANAGER|7839|02-Apr-81|2975||20|DALLAS 7788|SCOTT|ANALYST|7566|19-Apr-87|3000||20|DALLAS 7902|FORD|ANALYST|7566|03-Dec-81|3000||20|DALLAS 7369|SMITH|CLERK|7902|17-Dec-80|800||20|DALLAS 7499|ALLEN|SALESMAN|7698|20-Feb-81|1600|300|30|CHICAGO 7521|WARD|SALESMAN|7698|22-Feb-81|1250|500|30|CHICAGO 7654|MARTIN|SALESMAN|7698|28-Sep-81|1250|1400|30|CHICAGO 

我在awk语句下面试过,但是没有打印任何东西 –

 awk -F'|' 'NR==FNR {val[$1]=$3; next} $8 in val {print $1,$2,$3,$4,$5,$6,$7,$8,val[$1]}' OFS="|" dept.txt emp.txt 

任何build议?

问题是匹配列前有两个空格。 由于您正在使用“|” 作为字段分隔符,那么第二个文件的每一行按如下方式划分(以第一行为例)。

  10|ACCOUNTING|NEW YORK $1=" 10" $2="ACCOUNTING" $3="NEW YORK" 

所以你把Accounting" 10"而不是"10"来映射。 这就是为什么你没有在第二个文件中得到任何匹配。 (假设你想在第二个打印命令中使用val [$ 8]而不是val [$ 1])。

请执行下列操作。 这将解决您的问题。

 awk -F'|' 'NR==FNR {sub(" ","",$1);val[$1]=$3; next;} $8 in val {print $1,$2 ,$3,$4,$5,$6,$7,$8,val[$8]}' OFS="|" dept.txt emp.txt 

输出:

 7839|KING|PRESIDENT||17-Nov-81|5000||10|NEW YORK 7698|BLAKE|MANAGER|7839|01-May-81|2850||30|CHICAGO 7782|CLARK|MANAGER|7839|09-Jun-81|2450||10|NEW YORK 7566|JONES|MANAGER|7839|02-Apr-81|2975||20|DALLAS 7788|SCOTT|ANALYST|7566|19-Apr-87|3000||20|DALLAS 7902|FORD|ANALYST|7566|03-Dec-81|3000||20|DALLAS 7369|SMITH|CLERK|7902|17-Dec-80|800||20|DALLAS 7499|ALLEN|SALESMAN|7698|20-Feb-81|1600|300|30|CHICAGO 7521|WARD|SALESMAN|7698|22-Feb-81|1250|500|30|CHICAGO 7654|MARTIN|SALESMAN|7698|28-Sep-81|1250|1400|30|CHICAGO 

使用$NF ,这是最后一个字段的值:

 ➜ awk ' BEGIN { FS = OFS = "|" } NR==FNR { location[$1] = $NF; next } { print (location[$NF] ? $0 OFS location[$NF] : $0) } ' dept.txt emp.txt 7839|KING|PRESIDENT||17-Nov-81|5000||10|NEW YORK 7698|BLAKE|MANAGER|7839|01-May-81|2850||30|CHICAGO 7782|CLARK|MANAGER|7839|09-Jun-81|2450||10|NEW YORK 7566|JONES|MANAGER|7839|02-Apr-81|2975||20|DALLAS 7788|SCOTT|ANALYST|7566|19-Apr-87|3000||20|DALLAS 7902|FORD|ANALYST|7566|03-Dec-81|3000||20|DALLAS 7369|SMITH|CLERK|7902|17-Dec-80|800||20|DALLAS 7499|ALLEN|SALESMAN|7698|20-Feb-81|1600|300|30|CHICAGO 7521|WARD|SALESMAN|7698|22-Feb-81|1250|500|30|CHICAGO 7654|MARTIN|SALESMAN|7698|28-Sep-81|1250|1400|30|CHICAGO 

假设你仍然需要整条线路,不管局部城市指数是否存在。 如果不是,那么请更新您的问题,以反映常见用例和预期输出。

在你的代码行中,你应该通过具有id值的列来调用散列值,在你的情况中,第8列是存储要打印信息的文件的公共id的列。

 awk -F\| 'NR==FNR {val[$1]=$3; next} {print $1, $2, $3, $4, $5, $6, $7, $8, val[$8]};' OFS="|" dept.txt emp.txt