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
estou usando esse comando
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
mas os dados são muitos, não posso usar o loop while, está demorando muito tempo para usar o loop while. existe alguma outra maneira de fazer isso rápido, como usar "grep -vf file_1 file_2"
algo assim, passando assim. por favor, me avise.
aqui estou usando a lógica de obter a linha superior do padrão encontrado, o padrão é cada linha de"file_1.txt"
Responder1
Parece-me que seu código está imprimindo todas as linhas de file_1.txt, a menos que (a) a linha contenha name
ou (b) as duas primeiras colunas da linha sejam iguais à linha anterior que continha name
. Nesse caso, tente:
$ awk '/name/{bad[$1,$2];next} !(($1,$2) in bad)' file_1.txt
150 300
150 300
150 250
150 250
Como funciona
/name/{bad[$1,$2];next}
Se a linha atual contiver
name
, adicionaremos uma entrada à matriz associativabad
sob a chave das duas primeiras colunas. Em seguida, pulamos o restante dos comandos e pulamos para recomeçar anext
linha.!(($1,$2) in bad)
Se as duas primeiras colunas da linha atual
$1,$2
foremnãoentre as chaves debad
e imprima esta linha.