преобразуйте (sed или awk или что-либо) файл, содержащий следующее:

Я ищу способ преобразовать с одной строкой команду Linux (sed или awk или что-либо) следующий файл (example1.txt);

1.2.3.4:21
172.16.1.2:80
192.168.5.4:443
192.168.10.1:7007

в формат как это:

"1.2.3.4" "21"
"172.16.1.2" "80"
"192.168.5.4" "443"
"192.168.10.1" "7007"

Любая справка очень ценилась бы, спасибо.

2
задан 21 April 2020 в 09:20

6 ответов

AWK можно сделать переменные использования как ниже.

awk -F ':' -v q='"' '{print q $1 q " "  q $2 q}' example1.txt

-F Определяет разделителя полей. Именно так это делит два столбца на $1 и $2.

-v Помогает нам определить переменную, которая является q. q содержит двойную кавычку.

" " Дополнительное пространство здесь дает пространство между печатью.

  1. Печать первого поля:

    $ awk -F ':' '{print  $1}' example1.txt
    1.2.3.4
    172.16.1.2
    192.168.5.4
    192.168.10.1
    
  2. Печать второго столбца

    $ awk -F ':' '{print  $1  $2}' example1.txt
    1.2.3.421
    172.16.1.280
    192.168.5.4443
    192.168.10.17007
    
  3. Добавление промежуточного пространства.

    $ awk -F ':' '{print  $1  " " $2}' example1.txt
    1.2.3.4 21
    172.16.1.2 80
    192.168.5.4 443
    192.168.10.1 7007
    
  4. Добавление двойных кавычек.

    $ awk -F ':' -v q='"' '{print q $1 q " "  q $2 q}' example1.txt
    "1.2.3.4" "21"
    "172.16.1.2" "80"
    "192.168.5.4" "443"
    "192.168.10.1" "7007"
    

Выше команды только распечатает его. Если Вы хотите сохранить его в файл, можно работать ниже команды.

$ awk -F ':' -v q='"' '{print q $1 q " "  q $2 q}' example1.txt > example2.txt
$ cat example2.txt
"1.2.3.4" "21"
"172.16.1.2" "80"
"192.168.5.4" "443"
"192.168.10.1" "7007"

Кроме того, ниже команды может дать Вам тот же результат также.

$ awk -F':' '{print "\""$1"\""" ""\""$2"\""}' example1.txt
"1.2.3.4" "21"
"172.16.1.2" "80"
"192.168.5.4" "443"
"192.168.10.1" "7007"
6
ответ дан 25 April 2020 в 10:43

Нет никакой потребности использовать несколько команд sed, когда они все могут быть связаны в одного:

sed 's/^/"/; s/:/" "/; s/$/"/' input.txt

Используя awk:

awk '{sub("^","\"");sub(":","\" \"");sub("$","\"");print}' input.txt
3
ответ дан 25 April 2020 в 10:43

Использование Sed

sed 's/\(.*\):\(.*\)/"\1" "\2"/'

Использование Bash

while IFS=: read addr port; do echo \"$addr\" \"$port\"; done

или даже

while read line; do echo \"${line/:/'" "'}\"; done
3
ответ дан 25 April 2020 в 10:43

Можно использовать эту простую команду:

cat input-file | sed 's/:/" "/' | sed 's/^/"/' | sed 's/$/"/'

Не забудьте заменять input-file с Вашим реальным именем файла.

Если необходимо сохранить вывод в другой файл, затем добавляют перенаправление вывода, как это:

cat input-file | sed 's/:/" "/' | sed 's/^/"/' | sed 's/$/"/' > output-file

как прежде, не забудьте заменять output-file с Вашим предпочтительным именем выходного файла.

... и это - все!;)

2
ответ дан 25 April 2020 в 10:43

Используя Miller (https://github.com/johnkerl/miller) и выполнение

mlr --csv --quote-all -N --ifs ":" --ofs " " cat input.csv

Вы имеете

"1.2.3.4" "21"
"172.16.1.2" "80"
"192.168.5.4" "443"
"192.168.10.1" "7007"
0
ответ дан 25 April 2020 в 10:43

Это не единственная командная строка, но можно сделать это в энергии: запишите макрос для изменения строки и движения вниз, повторение так же много раз как строки (я принимаю 1 000 строк),

qqI"<Esc>f:s"<Space>"<Esc>A"<Esc>jq1000@q
0
ответ дан 25 April 2020 в 10:43

Другие вопросы по тегам:

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