Не могу использовать цикл while, так как это занимает время. Есть ли более быстрый способ получить конечный файл... в Linux

Не могу использовать цикл while, так как это занимает время. Есть ли более быстрый способ получить конечный файл... в Linux
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, затем выведите эту строку.

Связанный контент