2

I have already tried all options that I found online to solve my issue but without good result.

Basically I have two csv files (pipe separated):

file1.csv:

123|21|0452|IE|IE|1|MAYOBAN|BRIN|OFFICE|STREET|MAIN STREET|MAYOBAN|

123|21|0453|IE|IE|1|CORKKIN|ROBERT|SURNAME|CORK|APTS|CORKKIN|

123|21|0452|IE|IE|1|CORKCOR|NAME|HARRINGTON|DUBLIN|STREET|CORKCOR|

file2.csv:

MAYOBAN|BANGOR|2400

MAYOBEL|BELLAVARY|2400

CORKKIN|KINSALE|2200

CORKCOR|CORK|2200

DUBLD11|DUBLIN 11|2100

I need a linux bash script to find the value of pos.3 from file2 based on the content of pos7 in file1.

Example:

file1, line1, pos 7: MAYOBAN
find MAYOBAN in file2, return pos 3 (2400)

the output should be something like this:

**2400**

**2200**

**2200**

**etc...**

Please help Jacek

4

4 回答 4

5

一点方法,远非完美:

DELIMITER="|"

for i in $(cut -f 7 -d "${DELIMITER}" file1.csv ); 
do 
    grep "${i}" file2.csv | cut -f 3 -d "${DELIMITER}"; 
done
于 2012-05-22T07:53:31.283 回答
2

这将起作用,但由于必须对输入文件进行排序,因此输出顺序将受到影响:

join -t '|' -1 7 -2 1 -o 2.3 <(sort -t '|' -k7,7 file1.csv) <(sort -t '|' -k1,1 file2.csv)

输出如下所示:

2200
2200
2400

这是没用的。为了获得有用的输出,请包含键值:

join -t '|' -1 7 -2 1 -o 0,2.3 <(sort -t '|' -k7,7 file1.csv) <(sort -t '|' -k1,1 file2.csv)

然后输出如下所示:

CORKCOR|2200
CORKKIN|2200
MAYOBAN|2400

编辑:

这是一个 AWK 版本:

awk -F '|' 'FNR == NR {keys[$7]; next} {if ($1 in keys) print $3}' file1.csv file2.csv

这循环通过 file1.csv 并为字段 7 的每个值创建数组条目。只需引用数组元素即可创建它(具有空值)。FNR是当前文件NR中的记录号,是所有文件中的记录号。当它们相等时,正在处理第一个文件。该next指令读取下一条记录,创建一个循环。当FNR == NR不再为真时,处理后续文件。

所以 file2.csv 现在被处理,如果它有一个字段 1 存在于数组中,那么它的字段 3 被打印出来。

于 2012-05-22T14:59:59.773 回答
1

您可以使用米勒(https://github.com/johnkerl/miller)。

从 input01.txt 开始

123|21|0452|IE|IE|1|MAYOBAN|BRIN|OFFICE|STREET|MAIN STREET|MAYOBAN|
123|21|0453|IE|IE|1|CORKKIN|ROBERT|SURNAME|CORK|APTS|CORKKIN|
123|21|0452|IE|IE|1|CORKCOR|NAME|HARRINGTON|DUBLIN|STREET|CORKCOR|

和 input02.txt

MAYOBAN|BANGOR|2400
MAYOBEL|BELLAVARY|2400
CORKKIN|KINSALE|2200
CORKCOR|CORK|2200
DUBLD11|DUBLIN 11|2100

并运行

mlr --csv -N --ifs "|" join  -j 7 -l 7 -r 1 -f input01.txt then cut -f 3 input02.txt

你将会有

2400
2200
2200

一些注意事项:

  • -N设置没有标题的输入和输出;
  • --ifs "|"设置输入字段分隔符;
  • -l 7 -r 1设置输入文件的连接字段;
  • cut -f 33从连接输出中提取命名的字段
于 2020-08-31T06:54:39.983 回答
0
cut -d\| -f7 file1.csv|while read line
do 
  grep $line file1.csv|cut -d\| -f3
done
于 2015-03-27T04:38:57.380 回答