如果找到字符串,则从文件中删除行

时间:2017-06-14 15:17:16

标签: python-2.7 shell csv unix sed

我有一个包含数据的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文件中删除任何行)。可以帮到这个

4 个答案:

答案 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