我有一个 CSV 文件,其中包含我要筛选的列。我想使用一个模式文件来查找模式存在的所有条目,即使是列值的一部分,并用这个“模式”替换整个单元格值。 我列出了一个关键字列表,我想将它们用作我的“模式”库; 因此,如果此列中的某个单元格(本例仅次于此)将此“模式”作为其字符串的一部分,那么我想用此“模式”替换整个单元格。
例如:
我的目标文件:
id1,Taxidermy Equipment & Supplies,moreinfo1
id2,Taxis & Private Hire,moreinfo2
id3,Tax Services,moreinfo3
id4,Tools & Hardware,moreinfo4
id5,Tool Sharpening,moreinfo5
id6,Tool Shops,moreinfo6
id7,Video Conferencing,moreinfo7
id8,Video & DVD Shops,moreinfo8
id9,Woodworking Equipment & Supplies,moreinfo9
我的“模式”文件:
Taxidermy Equipment & Supplies
Taxis
Tax Services
Tool
Video
Wood
输出文件:
id1,Taxidermy Equipment & Supplies,moreinfo1
id2,Taxis,moreinfo2
id3,Tax Services,moreinfo3
id4,Tool,moreinfo4
id5,Tool,moreinfo5
id6,Tool,moreinfo6
id7,Video,moreinfo7
id8,Video,moreinfo8
id9,Wood,moreinfo9
我想到了通常的“查找和替换”sed:
sed -i 's/PATTERN/REPLACE/g' file.csv
但我希望它在特定列上运行,所以我想到了:
awk 'BEGIN{OFS=FS="|"}$2==PATTERN{$2=REPLACE}{print}' file.csv
但它不适用于“字符串的一部分”([视频]:“视频和 DVD 商店”->“视频”)而且我似乎无法理解 awk 如何将输入作为文件用于“模式” block 。
是否有用于此的 awk 脚本?或者我是否必须写一些东西(例如在带有内置 csv 套件的 python 中?)
最佳答案
在 awk 中,使用 index
。它仅在进行替换时打印记录,但即使没有匹配也很容易修改为打印(例如将 print $1,i,$3}
替换为 $0=$1 OFS i OFS $3} 1
):
$ awk -F, -v OFS=, '
NR==FNR { a[$1]; next } # store "patterns" to a arr
{ for(i in a) # go thru whole a for each record
if(index($2,i)) # if "pattern" matches $2
print $1,i,$3 # print with replacement
}
' pattern_file target_file
id1,Taxidermy Equipment & Supplies,moreinfo1
id2,Taxis,moreinfo2
id3,Tax Services,moreinfo3
id4,Tool,moreinfo4
id5,Tool,moreinfo5
id6,Tool,moreinfo6
id7,Video,moreinfo7
id8,Video,moreinfo8
id9,Wood,moreinfo9
关于python - 在 CSV 中查找字符串的一部分并用新条目替换整个单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41537084/