как удалить последовательные записи, если они имеют одно и то же поле, используя awk или sed?

Я хотел бы, чтобы вы дали мне больше информации, чтобы помочь вам, здесь я оставляю то, что мне нужно:

  • При подключении USB-модема к ПК откройте консоль и введите:dmesg | grep tty. Не могли бы вы дать мне знать ответ? Это нужно для проверки того, куда был подключен модем, в настоящее время он у меня есть, и он подключается как /dev/ttyACM0

  • Вы уверены, что используете правильную скорость(baudio )? Эта проблема кажется типичной для неудачно выбранной скорости .

  • Проверил, что при использовании миникома вместо входа в программу и последующей настройки параметров предпочтительнее обращаться напрямую с уже предложенными параметрами, например :minicom -D /dev/ttyACM0 -b 9600Является -D для «устройство » и -b для «скорость » в (baudios)

1
18.12.2020, 04:07
5 ответов

Игнорируя номера строк (, которые, как я полагаю, существуют только для читателей вопроса ), вы, похоже, в основном хотите объединить диапазоны, которые лежат спиной к спине, т.е. удалить любуюend=Xstart=Yпару где Xи Y— одно и то же число.

$ tr '\n' '\t' < file | sed 's/end=\([[:digit:].]*\)[[:blank:]]start=\1[[:blank:]]//g' | tr '\t' '\n'
start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2

Это сначала заменяет каждую новую строку во входных данных табуляцией, а затем использует sedдля удаления каждой пары end=start=, которые имеют одинаковый номер после знака =. После объединения диапазонов вкладки снова заменяются символами новой строки.

1
18.03.2021, 22:42

С awkдвойным разбором файла и печатью только строк с уникальным последним полем.

$ awk -F= 'p==1{seen[$NF]++} p==2 && seen[$NF]==1' p=1 file p=2 file
start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2

Или то же самое, используя классический awkидиоматический синтаксис(FNR==NRозначает 'при чтении первого файла', также nextнеобходимо)

awk -F= 'FNR==NR {seen[$NF]++; next} seen[$NF]==1' file file
2
18.03.2021, 22:42

С реализацией GNU uniqи при условии, что ввод не содержит символов TAB, вы могли бы сделать:

<your-file tr = '\t' | uniq -uf1 | tr '\t' =
2
18.03.2021, 22:42
for i in `awk -F "=" '{if(!seen[$NF]++)print $NF}' file`; do   p=`awk -F "=" -v i="$i" '$NF == i{print $0}' file|wc -l`;if [[ $p == 1 ]]; then awk -F "=" -v i="$i" '$NF == i{print $0}' file; fi; done

выход

start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2
0
18.03.2021, 22:42

GNU sed :поддерживает 2 -строчного шаблона. Полностью удалите пространство шаблона, если совпадение найдено, в противном случае распечатайте его целиком.

sed -Ee '
  /^end=/!b
  $!N
  /=(.*)\nstart=\1$/d
' file 

perl -aF= -pe '
  next if eof || !/^end=/;
  ($_.= <>) =~ /=(\S+)$/;
  s/.*//s if  $1 == $F[1];
' file 

awk -F '=' '
  BEGIN { OFS = ORS }
  END { if (f) print l }
  /^end=/ && !f {
    l = $0; t = $2
    f = 1; next
  }
  /^start=/ && f {
    if ($2+0 != t) print l, $0
    f = 0
    next
  }1
' file

Выход:

start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2
0
18.03.2021, 22:42

Теги

Похожие вопросы