Фильтрация данных в файле CSV - PullRequest
1 голос
/ 12 марта 2019

У меня есть CSV-файл в этом формате

a,b,c,d,e,f,no disk detected
a,b,c,d,e,f,disk run into error
a,b,c,d,e,f,no memory in the server
a,b,c,d,e,f,memory has correctable errors

в последнем столбце, мне нужно найти слово

диск и заменить его диском памяти ошибок и заменить его наошибка памяти Эта часть, которую я уже выяснил

 cat filename.csv |awk -F "," '{print $NF}' |sed 's/^.*disk.*$/disk error/'  |sed 's/^.*memory.*$/memory error/' 

Теперь часть, в которой мне нужна помощь, когда sed заменяет эту строку, можно ли записать в тот же файл (filename.csv) или создать новый файл свсе столбцы + обновленный столбец, поэтому новый файл будет выглядеть так

 a,b,c,d,e,f,disk error
 a,b,c,d,e,f,disk error
 a,b,c,d,e,f,memory error
 a,b,c,d,e,f,memory error

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Решение awk:

awk -F, '{if ($NF~/disk/) $NF="disk error"; if ($NF~/memory/) $NF="memory error";}1' OFS=, file

С GNU awk v4.1.0 + вы можете добавить переключатель -i inplace для изменения file на месте.
В противном случае попробуйте awk .... file | tee file.

Таким образом, указанная выше команда сама по себе не требует GNU awk, но если у вас есть GNU awk, вы можете сделать это более кратким способом:

awk -F, '{match($NF,"(disk|memory)",m);$NF=m[1] " error";}1' OFS=, file

NF означает номер столбца,$NF означает последний столбец.
-F, установите разделитель поля FS на запятую.
OFS=, установите разделитель поля вывода на запятую.

2 голосов
/ 12 марта 2019

Это проще сделать с sed:

sed -E 's/^(.+,).*(disk|memory).*$/\1\2 error/' file.csv

a,b,c,d,e,f,disk error
a,b,c,d,e,f,disk error
a,b,c,d,e,f,memory error
a,b,c,d,e,f,memory error

Чтобы внести изменения в одном файле, используйте:

sed -i.bak -E 's/^(.+,).*(disk|memory).*$/\1\2 error/' file.csv

== Подробности ==

Регулярное выражение поиска:

  • ^: начало
  • (.+,): Жадное совпадение до последней запятой и захват ее в группе # 1
  • .*(disk|memory): сопоставить 0 или более символов перед соответствием disk или memory и захватить его в группе # 2
  • .*$: сопоставить 0 или более символов до конца

Шаблон замены:

  • \1: обратная ссылка нагруппа # 1 для размещения текста до последней запятой
  • \2 error: Добавить disk error или memory error
...