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