как убрать столбцы кроме последнего? - PullRequest
2 голосов
/ 25 апреля 2019

Я хочу переместить столбцы, кроме последнего, я не знаю, был ли какой-либо способ сделать это с помощью awk или sed или какой-либо другой строковой команды

 ...
    00000000: 30327c30 30303131 36333132 567c317c  0|2011002136|1|V
    00000010: 44204149 56452045 4d415449 544e4549  IA DE EVITAMIENT
    00000020: 7c007c4f 30327c00 302d3131 37312d33  O|.|.|2011-03-17
    00000030: 3a393020 303a3035 33427c30 38313957   09:50:00|B3W918
    00000040: 327c317c 7c39397c 4f52544f 4f4d7c53  |1|2|99|OTROS|MO
    00000050: 414b4f54 7c007c52 7c007c00 36312d47  TOKAR|.|.|.|G-16
    00000060: 7c54527c 444e4f43 52494355 204e5520  |RT|CONDUCIR UN 
    00000070: 49484556 4f4c5543 524f5020 414e5520  VEHICULO POR UNA
    ...

Я пытался, но только удалитьпервый столбец

$ cat file | sed -E $'s/ +/\t/g' | cut -f2-

я хочу этот результат.Последний столбец

    ...
    0|2011002136|1|V
    IA DE EVITAMIENT
    O|.|.|2011-03-17
    09:50:00|B3W918
    |1|2|99|OTROS|MO
    TOKAR|.|.|.|G-16
    |RT|CONDUCIR UN 
    VEHICULO POR UNA
    ...

Ответы [ 6 ]

3 голосов
/ 25 апреля 2019

Похоже, вы просто пытаетесь получить последние 16 символов.

$ sed 's/.*\(.\{16\}\)/\1/' file
0|2011002136|1|V
IA DE EVITAMIENT
O|.|.|2011-03-17
 09:50:00|B3W918
|1|2|99|OTROS|MO
TOKAR|.|.|.|G-16
|RT|CONDUCIR UN
VEHICULO POR UNA

Я внимательно посмотрел на ваш пример и понял, что это шестнадцатеричный дамп, созданный с помощью xxd -e. Если вы хотите получить оригинальный файл, используйте следующее:

$ xxd -r file | xxd -e | xxd -r > original_file
$ cat original_file
0|2011002136|1|VIA DE EVITAMIENTO|||2011-03-17 09:50:00|B3W918|1|2|99|OTROS|MOTOKAR||||G-16|RT|CONDUCIR UN VEHICULO POR UNA

P.S .: original_file содержит байты NUL, но они не отображаются на терминале.

2 голосов
/ 25 апреля 2019

Альтернатива печати последних 16 символов с помощью grep:

grep -Po '.{16}$' file

или

grep -o '.\{16\}$' file

  • -P длярегулярные выражения Perl
  • -o только для сопоставления
1 голос
/ 25 апреля 2019
awk '{print "    "$NF}' file
...
0|2011002136|1|V
EVITAMIENT
O|.|.|2011-03-17
09:50:00|B3W918
|1|2|99|OTROS|MO
TOKAR|.|.|.|G-16
UN
UNA
... 
1 голос
/ 25 апреля 2019

Кажется, что самые простые решения не были упомянуты.

Вы действительно хотите, чтобы символы начинались с 52-й позиции.Так что используйте cut:

Вход:

▶ cat > FILE <<EOF
    00000000: 30327c30 30303131 36333132 567c317c  0|2011002136|1|V
    00000010: 44204149 56452045 4d415449 544e4549  IA DE EVITAMIENT
    00000020: 7c007c4f 30327c00 302d3131 37312d33  O|.|.|2011-03-17
    00000030: 3a393020 303a3035 33427c30 38313957   09:50:00|B3W918
    00000040: 327c317c 7c39397c 4f52544f 4f4d7c53  |1|2|99|OTROS|MO
    00000050: 414b4f54 7c007c52 7c007c00 36312d47  TOKAR|.|.|.|G-16
    00000060: 7c54527c 444e4f43 52494355 204e5520  |RT|CONDUCIR UN
    00000070: 49484556 4f4c5543 524f5020 414e5520  VEHICULO POR UNA
EOF

Выход:

▶ cut -c52- FILE
0|2011002136|1|V
IA DE EVITAMIENT
O|.|.|2011-03-17
 09:50:00|B3W918
|1|2|99|OTROS|MO
TOKAR|.|.|.|G-16
|RT|CONDUCIR UN
VEHICULO POR UNA

Обратите внимание, что разрез может быть эмулирован в sed таким образом, как отмечено вкомментарий:

▶ sed -E 's/.{51}//' FILE

Другой способ - использовать AWK для установки ширины поля, если у вас есть версия AWK, которая поддерживает его, например GNU AWK, nawk (Mac OS X) и т. д.

▶ gawk 'BEGIN {FIELDWIDTHS = "15 9 9 9 9 16"} {print $6}' FILE
0|2011002136|1|V
IA DE EVITAMIENT
O|.|.|2011-03-17
 09:50:00|B3W918
|1|2|99|OTROS|MO
TOKAR|.|.|.|G-16
|RT|CONDUCIR UN
VEHICULO POR UNA

Преимущество решения AWK состоит в том, что, хотя и немного больше усилий по настройке, оно сообщает больше информации о ваших ожиданиях данных читателю вашего кода.

Чтобы выяснитьтам, где начинаются все столбцы, вы можете использовать CTRL + g в Vim после наведения на них курсора.

1 голос
/ 25 апреля 2019

Просто удалите первые 5 полей, разделенных пробелами.

С GNU sed:

$ sed -E 's/(\s+\S+){5}\s+//' file
0|2011002136|1|V
IA DE EVITAMIENT
O|.|.|2011-03-17
09:50:00|B3W918
|1|2|99|OTROS|MO
TOKAR|.|.|.|G-16
|RT|CONDUCIR UN
VEHICULO POR UNA

С любым POSIX sed:

$ sed 's/\([[:space:]]*[^[:space:]]*\)\{5\}[[:space:]]*//' file
0|2011002136|1|V
IA DE EVITAMIENT
O|.|.|2011-03-17
09:50:00|B3W918
|1|2|99|OTROS|MO
TOKAR|.|.|.|G-16
|RT|CONDUCIR UN
VEHICULO POR UNA
0 голосов
/ 25 апреля 2019

если ваши данные в d файле, попробуйте на GNU AWK

awk -F' [a-f0-9]{8}  ' '{print $2}' d

попробовал на GNU SED

sed -E 's/.*\s[a-f0-9]{8}\s{2,}(.*)/\1/' d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...