检查一个文件的字段是否存在于另一个文件中并更新第一个文件的特定列

检查一个文件的字段是否存在于另一个文件中并更新第一个文件的特定列

我有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,,

相关内容