awk - 在csv文件中,查找匹配

分享于 

3分钟阅读

ubuntu

  繁體

问题:

我有两个CSV文件。

1.csv包含:

 
46700468915;2000



2.csv包含:

 
4670046;Tele2




awk 'NR==FNR {a[$1]=$2; next} $2 in a {print $0, a[$2]}' OFS='t' 2.csv 1.csv




答案1:

有一些问题:

你需要设置awk的字段分隔符:默认情况下,它是空白,而你的文件似乎用分号分隔,

你试图匹配部分字段:4670046a中,但是46700468915不在,

似乎混淆了你匹配的字段$1$2

如果知道要匹配前7个字符,可以尝试


awk -F ';' '


 NR==FNR {a[$1]=$2; next} {k = substr($1,1,7)} k in a {print $0, a[k]}


' OFS='t' 2.csv 1.csv



或者,等价的


awk '


 BEGIN{FS=";"; OFS="t"} 


 NR==FNR {a[$1]=$2; next} {k = substr($1,1,7)} k in a {print $0, a[k]}


' 2.csv 1.csv



例子


$ head ?.csv


==> 1.csv <==


46700468915;2000



==> 2.csv <==


4670046;Tele2



然后


$ awk 'BEGIN{FS=";"; OFS="t"} NR==FNR {a[$1]=$2; next} {k = substr($1,1,7)} k in a {print $0, a[k]}' 2.csv 1.csv


46700468915;2000 Tele2




答案2:

awk解决方案应该快得多,但是这里有一个示例,如何通过bash脚本实现这一点。

 
$ cat ./script.sh




#!/bin/bash



TARGET_FILE="./1.csv"


ORIGIN_FILE="./2.csv"



# In order to append new column to a line, comment-out -i.bak


while IFS=';' read -r -a line


do


 if grep -q"${line[0]}""$TARGET_FILE"


 then


 sed"/^${line[0]}/ s/$/;${line[1]}/""$TARGET_FILE" #-i.bak


 fi


done <"$ORIGIN_FILE"



echo '-----'



# In order to replace the second column of a line, comment-out -i.bak


while IFS=';' read -r -a line


do


 if grep -q"${line[0]}""$TARGET_FILE"


 then


 sed -r"s/(^${line[0]}.*;).*$/1${line[1]}/""$TARGET_FILE" #-i.bak


 fi


done <"$ORIGIN_FILE"



用法示例:


$ cat 1.csv


46700468915;2000


46700568916;3000


46700668917;4000



$ cat 2.csv


4670046;Tele2


4670047;Tele3


4670048;Tele4



$ ./script.sh


46700468915;2000;Tele2


46700568916;3000


46700668917;4000


-----


46700468915;Tele2


46700568916;3000


46700668917;4000





文件  MAT  FIND  CSV  AWK  
相关文章