问题:
我有两个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的字段分隔符:默认情况下,它是空白,而你的文件似乎用分号分隔,
你试图匹配部分字段:4670046
在a
中,但是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
相关文章