2

У меня есть файл, который содержит строки, которые выглядят следующим образом:

14|geauxtigers|90
14|geauxtigers|null

Я хочу удалить все экземпляры в файле с нулем в качестве последнего члена. Есть ли способ сделать это с помощью команд Unix?

Я собирался прочитать в файле с Java и посмотреть на соседние строки и удалить строку, чья смежная строка имеет первые два слагаемых, но нулевой как третий слагаемый. Есть ли способ сделать это с помощью инструментов Unix?

Изменить: я не хочу слепо удалять все термины с нулем в качестве третьего термина, я мог бы иметь следующую запись: 15 | lsu | null Я хотел бы сохранить его, так как это единственная запись. Просто если есть еще одна строка с третьим слагаемым, отличным от NULL, я бы хотел оставить ненулевое значение.

8 ответов8

1

Я хотел бы добавить еще один ответ, используя awk:

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

тестовое задание

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
0

Предполагая, что строки могут располагаться в любом порядке, а результат упорядочен численно в первом поле, вот решение 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}
}'
0

Предполагая, что строки могут появляться в любом порядке, отсканируйте файл дважды, сначала найдя ненулевые строки: я предполагаю, что "ключ" - это первые два столбца:

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

Если нулевая строка всегда следует за партнером:

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

Это передает файл с именем file (вы можете указать другое имя после cat) через команду grep, которая фильтрует строки с шаблонами. '-V' инвертирует совпадение, поэтому совпадают все строки, которые не имеют шаблона. Наконец результат помещается в файл2.

-1
grep -Ev 'null' > newfile.with.nulls.removed
-1

Попробуйте использовать grep -v:

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

В зависимости от вашего вкуса Linux, вы можете попробовать что-то вроде:

egrep -v '[|]null$' < file.in > file.out

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .