Jak usunąć podobne instancje linii przy użyciu poleceń Unix?

2

Mam plik zawierający wiersze, które wyglądają następująco:

14|geauxtigers|90
14|geauxtigers|null

Chcę usunąć wszystkie instancje z pliku o wartości null jako ostatniego terminu. Czy można to zrobić za pomocą komend Unix?

Miałem zamiar wczytać plik za pomocą Java i spojrzeć na sąsiednie linie i usunąć linię, której sąsiednia linia ma podobne pierwsze dwa terminy, ale null jako trzeci termin. Czy można to zrobić za pomocą narzędzi Unix?

Edytuj: Nie chcę ślepo usuwać wszystkich terminów z null jako trzeciego terminu, mogę mieć następujący wpis: 15 | lsu | null Chciałbym to zachować, ponieważ jest to jedyny wpis. Po prostu, jeśli istnieje inna linia z trzecim terminem, który nie jest pusty, chciałbym zachować wartość inną niż null.

egidra
źródło
Co to ma wspólnego z Javą?
Matt Ball
To wygląda na pracę dla sed i grep polecenia, pozwolę ekspertom odpowiedzieć na to pytanie
jestem ciekawa, że ​​5 odpowiedzi, ale nikt nie dał rozwiązania AWK dla tak typowego „pytania awk”
To jest nieokreślone. Czy „podobne” linie zawsze sąsiadują? Czy chcesz, aby wynik był w tej samej kolejności co dane wejściowe?
ninjalj

Odpowiedzi:

1

Chciałbym dodać jeszcze jedną odpowiedź, używając awk:

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

test

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
Kent
źródło
0
grep -v '|null$' yourfile.txt > filtered.txt

źródło
Użytkownik musi selektywnie usuwać puste linie.
glenn jackman
0

Zakładając, że linie mogą mieć dowolną kolejność, a wynik jest uporządkowany liczbowo na pierwszym polu, oto rozwiązanie Perla:

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}
}'
ninjalj
źródło
0

Zakładając, że linie mogą pojawić się w dowolnej kolejności, zeskanuj plik dwukrotnie, najpierw znajdując linie niepuste.

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

Jeśli linia zerowa zawsze podąża za swoim partnerem:

awk -F '|' '
  $NF != null {seen[$1 FS $2]}
  $NF == "null" && $1 FS $2 in seen {next}
  {print}
' filename > file.nonulls 
glenn jackman
źródło
-1
cat file | grep -v '|null$' > file2

Powoduje to potokowanie pliku o nazwie plik (możesz wpisać inną nazwę za kotem) za pomocą polecenia grep, które filtruje linie wzorami. '-V' odwraca dopasowanie, więc wszystkie linie są dopasowane, które nie mają wzorca. Ostatecznie wynik jest umieszczany w pliku2.

Mnementh
źródło
Użytkownik musi selektywnie usuwać puste linie.
glenn jackman
To zostało dodane jako edycja do pytania. Odpowiedzi na to stare pytanie udzielono, jak pokazują podobne odpowiedzi. Postaram się poprawić moją odpowiedź później, ale nie mam wystarczająco dużo czasu w pracy.
Mnementh
-1
grep -Ev 'null' > newfile.with.nulls.removed
Tim
źródło
Użytkownik musi selektywnie usuwać puste linie.
glenn jackman
-1

Spróbuj użyć grep -v:

grep -v '|null$' myfile.txt > myfile-fixed.txt
maerics
źródło
Użytkownik musi selektywnie usuwać puste linie.
glenn jackman
-1

W zależności od smaku Linuksa możesz spróbować czegoś takiego:

egrep -v '[|]null$' < file.in > file.out
rsp
źródło
Użytkownik musi selektywnie usuwać puste linie.
glenn jackman