
cat file_1.txt
100 200 name
100 200
100 200
150 300
150 300
150 250
150 250
150 300 name
final file should be
150 300
150 300
150 250
150 250
Я использую эту команду
cat file_1.txt | grep -v "name">file_2.txt; cat file_2.txt| while read line;do cat file_1.txt| grep "$line"| head -1|grep -v "name" ;done
но данных слишком много, не могу использовать цикл while, это занимает слишком много времени, cat используйте цикл while. есть ли другой способ сделать это быстрее, как использовать "grep -vf file_1 file_2"
что-то вроде этого? Передавая таким образом? пожалуйста, дайте мне знать.
здесь я использую логику получения самой верхней строки шаблона, найденный шаблон - это каждая строка"file_1.txt"
решение1
Мне кажется, что ваш код выводит каждую строку file_1.txt, если только (a) строка не содержит name
или (b) первые два столбца строки не совпадают с предыдущей строкой, содержащей name
. В этом случае попробуйте:
$ awk '/name/{bad[$1,$2];next} !(($1,$2) in bad)' file_1.txt
150 300
150 300
150 250
150 250
Как это работает
/name/{bad[$1,$2];next}
Если текущая строка содержит
name
, то мы добавляем запись в ассоциативный массивbad
под ключом первых двух столбцов. Затем мы пропускаем остальные команды и переходим к началу строкиnext
.!(($1,$2) in bad)
Если первые два столбца текущей строки
$1,$2
равнынетсреди ключейbad
, затем выведите эту строку.