Como removo instâncias semelhantes de linhas usando comandos Unix?

2

Eu tenho um arquivo que contém linhas parecidas com as seguintes:

14|geauxtigers|90
14|geauxtigers|null

Eu quero remover todas as instâncias no arquivo com o nulo como o último termo. Existe uma maneira de fazer isso com comandos do Unix?

Eu ia ler no arquivo com Java e olhar para as linhas adjacentes e remover a linha cuja linha adjacente tem dois primeiros termos semelhantes, mas nulo como o terceiro termo. Existe uma maneira de fazer isso através das ferramentas do Unix?

Editar: não quero remover cegamente todos os termos com nulo como o terceiro termo, posso ter a seguinte entrada: 15 | lsu | null Eu gostaria de mantê-lo, pois é a única entrada. É só que, se houver outra linha com um terceiro termo que não seja nulo, eu gostaria de manter o valor não nulo.

    
por egidra 24.10.2011 / 22:01

8 respostas

1

Gostaria de adicionar mais uma resposta, usando o awk:

awk -F'|' '{if($3!="null"){a=$1;b=$2;print}else{if(a!=$1 || b!=$2)print}}' yourFile

teste

kent$  echo "14|geauxtigers|90
14|geauxtigers|null
foo|bar|blah
x|y|z
x|y|null"|awk -F'|' '{if($3!="null"){a=$1;b=$2;print}else{if(a!=$1 || b!=$2)print}}'    
14|geauxtigers|90
foo|bar|blah
x|y|z
    
por 24.10.2011 / 22:29
0
grep -v '|null$' yourfile.txt > filtered.txt
    
por 24.10.2011 / 22:04
0

Supondo que as linhas possam vir em qualquer ordem e o resultado seja ordenado numericamente no primeiro campo, aqui está uma solução Perl:

echo -e "2|asd|null
11|bla|asd
14|geauxtigers|90
2|asd|2
15|lsu|null
14|geauxtigers|null" | perl -e '
while(<>) {
  $line=$_;
  s@\|[^|]*$@@;
  $hash{$_}=$line
}
for $line (sort {$a<=>$b} keys %hash) {
  print $hash{$line}
}'
    
por 24.10.2011 / 23:42
0

Supondo que as linhas possam aparecer em qualquer ordem, digitalize o arquivo duas vezes, primeiro encontrando as linhas não nulas: Assumo que a "chave" são as duas primeiras colunas:

awk -F '|' '
  NR == FNR  && $NF != "null" { notnull[$1 FS $2]; next }
  $NF == "null" && $1 FS $2 in notnull {next}
  {print} 
' filename filename > file.nonulls 

Se a linha nula seguir sempre o parceiro:

awk -F '|' '
  $NF != null {seen[$1 FS $2]}
  $NF == "null" && $1 FS $2 in seen {next}
  {print}
' filename > file.nonulls 
    
por 25.10.2011 / 02:06
-1
cat file | grep -v '|null$' > file2

Isto canaliza o arquivo chamado file (você pode preencher outro nome após o cat) através do comando grep que filtra as linhas com os padrões. O '-v' inverte a correspondência, então todas as linhas são combinadas, e não o padrão. Por fim, o resultado é colocado no arquivo2.

    
por 24.10.2011 / 22:05
-1
grep -Ev 'null' > newfile.with.nulls.removed
    
por 24.10.2011 / 22:05
-1

Tente usar grep -v :

grep -v '|null$' myfile.txt > myfile-fixed.txt
    
por 24.10.2011 / 22:05
-1

Dependendo do sabor do seu linux, você pode tentar algo como:

egrep -v '[|]null$' < file.in > file.out
    
por 24.10.2011 / 22:05