Вырезать поля в каждой второй строке и объединить результат в строку без пробелов - PullRequest
0 голосов
/ 31 мая 2018

У меня есть следующие данные:

cat received.cap | grep -E "0x00(2|3)0" | cut -d " " -f 2-
 0000 0000 bbc0 0000 0000 0000 0000 0000
 5155 4642 5155 4a43 516b 4a44
 0000 0000 d4da 0000 0000 0000 0000 0001
 5130 4e44 5245 5245 5245 5646
 0000 0000 f5f3 0000 0000 0000 0000 0002
 5255 5647 526b 5a47 5230 634b

Я хочу последние два поля в каждой второй строке:

0000 0000
5155 4642 5155 4a43 516b 4a44
0000 0001
5130 4e44 5245 5245 5245 5646
0000 0002
5255 5647 526b 5a47 5230 634b

... и объединить общий результат в строкубез пробелов:

000000005155464251554a43516b4a440000000151304e445245524552455646...

возможно ли это, продолжая мой текущий конвейер?

Ответы [ 4 ]

0 голосов
/ 31 мая 2018

После awk может также помочь вам в этом.

awk '
NR%2!=0{
  val=val?val $(NF-1) $NF:$(NF-1) $NF;
  next}
{
  gsub(/ /,"" );
  val=val?val $0:$0
}
END{
  print val
}'  Input_file

Или, если вы хотите добавить его к своей предыдущей команде, выполните также your_command(s) | awk command above....

0 голосов
/ 31 мая 2018

При условии, что ваш входной файл:

$ cat file 
 0000 0000 bbc0 0000 0000 0000 0000 0000
 5155 4642 5155 4a43 516b 4a44
 0000 0000 d4da 0000 0000 0000 0000 0001
 5130 4e44 5245 5245 5245 5646
 0000 0000 f5f3 0000 0000 0000 0000 0002
 5255 5647 526b 5a47 5230 634b

Вы можете использовать эту команду awk:

awk 'NR%2{print $(NF-1),$NF} (NR+1)%2{$1=$1;print}' OFS="" ORS="" file

Это зависит от NR, который представляет номер записи (например,линия).Он печатает каждую вторую строку последние 2 поля.

OFS и ORS - выходные разделители, для которых задана пустая строка, чтобы получить все в одной строке без пробелов.

Оператор $1=$1 должен заставить awk переформатировать строку в соответствии с форматом, установленным ORS и OFS.

Если вы хотите новую строку в конце строкиВы можете добавить заявление END{print "\n"}.

0 голосов
/ 31 мая 2018

Добавить

| sed 'N;s/\n//' | cut -d " " -f 1-2,9- | tr -d ' \n'

или

| awk '{all=all $1 $2; getline; all=all $1 $2 $3 $4 $5 $6} END{print all}'

Вывод:

000000005155464251554a43516b4a440000000151304e4452455245524556460000000252555647526b5a475230634b
0 голосов
/ 31 мая 2018

Вы можете использовать sed с адресом ~ для замены каждой второй строки, чем tr для удаления пробелов:

... | sed '1~2s/.*\( [^ ]* [^ ]*$\)/\1/' | tr -d ' \n'

Возможно, вы также можете использовать sed для предыдущих шагов, чтобы сделатьэто быстрее, но поскольку вы не опубликовали исходные данные, я не могу поэкспериментировать с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...