Как удалить строку, содержащую определенную строку в определенном месте, используя sed или awk? - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу найти и удалить все строки с определенной строкой определенной длины в определенном месте.

Одна строка в моем наборе данных выглядит примерно так:

STRING   1234567 1234567 7654321 6543217 5432176

Примечания:

  • Записи имеют ширину поля 8

  • Идентификационные номера могут повторяться в одной строке

  • Идентификационные номера могут повторяться в другой строке, но в другом месте - эти строки удалять не следует

В этом примере я хочу найти строки, содержащие «1234567», расположенные в столбце 17 и охватывающие столбец 24 (то есть третье поле), и удалить их. Как я могу сделать это с помощью sed или awk?

Я использовал следующее, но оно удаляет строки, которые я хочу сохранить:

sed -i '/1234567/d' ./file_name.dat

Ура!

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

с awk, печать строк, за исключением совпадения подстроки.

$ awk 'substr($0,17,7)=="1234567"{next}1' file > output_file

или, возможно, обратная логика проще

$ awk 'substr($0,17,7)!="1234567"' file > output_file
0 голосов
/ 14 ноября 2018

Вы можете использовать

sed -i '/^.\{17\}1234567/d' ./file_name.dat

Подробности

  • ^ - начало строки
  • .{17} - любое17 символов
  • 1234567 - подстрока.

См. online sed demo :

s="STRING   1234567 1234567 7654321 6543217 5432176
STRING   1234567 5534567 7654321 6543217 5432176"
sed '/^.\{17\}1234567/d' <<< "$s"
# => STRING   1234567 5534567 7654321 6543217 5432176
...