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.


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

0
grep -v '|null$' yourfile.txt > filtered.txt

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}
}'

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 

-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.


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

Spróbuj użyć grep -v:

grep -v '|null$' myfile.txt > myfile-fixed.txt

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

Użytkownik musi selektywnie usuwać puste linie.
glenn jackman
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.