![检查一个文件的字段是否存在于另一个文件中并更新第一个文件的特定列](https://linux22.com/image/75305/%E6%A3%80%E6%9F%A5%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E5%AD%97%E6%AE%B5%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E4%BA%8E%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E5%B9%B6%E6%9B%B4%E6%96%B0%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E7%89%B9%E5%AE%9A%E5%88%97.png)
我有2个文件如下:
a.txt
(制表符分隔,有 3 列和太多行):
city plate region
istanbul 36 marmara
trabzon 61 karadeniz
b.txt
(逗号分隔,有 4 列和太多行):
name,city,age,nationality
mehmet,trabzon,,
murat,istanbul,,
john,london,,
我想要做的是:检查 的第二列(city
字段)是否b.txt
存在于a.txt
(第一列 - city
)中以及是否存在于a.txt
;更新文件b.txt
并将第四列 ( nationality
) 设置为“土耳其语”。所以预期输出:
name,city,age,nationality
mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,
我尝试了以下命令,但它没有生成所需的输出:
nawk 'BEGIN { FS = "\t" } FNR == NR {x[$1] = $1; next;} {FS=OFS=","} FNR>1{if ($2 in x) {($4 = "turkish")} } 1' a.txt b.txt
name,city,age,nationality
mehmet,trabzon,,
murat,istanbul,,
john,london,,
我需要找出我的命令中的错误。
答案1
你的脚本运行良好。我的猜测是第一个文件有空格而不是制表符作为分隔符。
把没用的去掉BEGIN { FS = "\t" }
看看是否是这样。
答案2
尝试用sed
sed -n 's|\(.*\S\)\s\+[0-9].*|/\1/s/$/turkish/|p' a.txt |
sed -f - b.txt
答案3
使用awk
(请注意,第一个文件a.txt
必须完全加载到内存中):
awk -F"[\t, ]" 'FNR==NR&&NR!=1{a[$1]="turkish"}
FNR!=NR{OFS=",";if(FNR!=1){$NF=a[$2]};print}' a.txt b.txt
-F"[\t,]"
将 awks 分隔符设置为制表符和逗号FNR==NR&&NR!=1
仅适用于第一个文件a.txt
并忽略第一行(标题)a[$1]="turkish"
a
设置在称为第一个字段索引的数组中$1
FNR!=NR
仅适用于第二个文件b.txt
OFS=","
设置输出字段分隔符if(FNR!=1)
仅当不是标题行时才执行某些操作$NF=a[$2]
turkish
如果数组中存在最后一个字段,则将其设置为之前保存的值print
并打印该行(如果该值存在或不存在)
输出:
name,city,age,nationality
mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,
答案4
tr -s \[:blank:] , <a.txt| #dont mess with weird columns
cut -d, -f1 | sort -u | #drop all but unique first column entries
sed -e's/[]*^\./$[]/\\&/g'\ #handle any regex metachars properly
-e's/.*/^[^,]*,&,/' | #match only second column
grep -nf - -- b.txt | #get line numbers at head of matched lines
sed -e's/:.*/be/' | #keep only matched line numbers + 'be'
sed -f - -eb -e:e \ #branch away or append turkish
-e's/$/turkish/' -- b.txt
mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,