我有一个包含数据的name.csv
文件
x
y
z
我有另一个csv文件data.csv
,必须从中删除这些行
a,20
b,30
x,40
y,50
z,60
我正尝试使用以下代码从name.csv
文件中删除data.csv
中的字符串:
#!/bin/sh
while IFS= read -r name
do
sed '/$name/d' data.csv
done <name.csv
上面的shell脚本没有工作(没有从data.csv
文件中删除任何行)。可以帮到这个
答案 0 :(得分:1)
awk
:
awk -F, 'FNR==NR { h[$1]; next } !($1 in h)' file1 file2
输出:
a,20
b,30
答案 1 :(得分:1)
grep
:
grep -vf name.csv data.csv
输出:
a,20
b,30
说明:
grep -v
将输出与grep grep -f name.csv
使用name.csv作为模式文件grep -vf name.csv
将输出所有与name.csv 如果您想匹配整个单词而不是单词的子字符串,可以尝试添加grep -vwf
全字regexp选项的-w
。
答案 2 :(得分:0)
使用此:
#!/bin/sh
while IFS= read -r name
do
sed -i "/${name}/d" data.csv
done <name.csv
答案 3 :(得分:0)
使用Python,可以按如下方式完成:
adb shell rm -r /whatever/the/directory/path/is
import csv
# Read all names to be removed into a set
with open('name.csv') as f_name:
names = set(row[0] for row in csv.reader(f_name))
# Read the data file and keep all entries not in the set
with open('data.csv', 'rb') as f_data:
csv_data = csv.reader(f_data)
data = [row for row in csv_data if row[0] not in names]
# Reopen the data file and write all filtered entries back to the file
with open('data.csv', 'wb') as f_data:
csv_data = csv.writer(f_data)
csv_data.writerows(data)
只能包含要删除的项目,每行一个,或者与name.csv
格式相同,在这种情况下使用第一列条目。
对于给定的数据,这会产生包含以下内容的输出data.csv
data.csv