Я ищу способ преобразовать с одной строкой команду 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"
Любая справка очень ценилась бы, спасибо.
AWK можно сделать переменные использования как ниже.
awk -F ':' -v q='"' '{print q $1 q " " q $2 q}' example1.txt
-F
Определяет разделителя полей. Именно так это делит два столбца на $1
и $2
.
-v
Помогает нам определить переменную, которая является q
. q
содержит двойную кавычку.
" "
Дополнительное пространство здесь дает пространство между печатью.
Печать первого поля:
$ awk -F ':' '{print $1}' example1.txt
1.2.3.4
172.16.1.2
192.168.5.4
192.168.10.1
Печать второго столбца
$ awk -F ':' '{print $1 $2}' example1.txt
1.2.3.421
172.16.1.280
192.168.5.4443
192.168.10.17007
Добавление промежуточного пространства.
$ 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
Добавление двойных кавычек.
$ 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"
Нет никакой потребности использовать несколько команд sed, когда они все могут быть связаны в одного:
sed 's/^/"/; s/:/" "/; s/$/"/' input.txt
Используя awk:
awk '{sub("^","\"");sub(":","\" \"");sub("$","\"");print}' input.txt
sed 's/\(.*\):\(.*\)/"\1" "\2"/'
while IFS=: read addr port; do echo \"$addr\" \"$port\"; done
или даже
while read line; do echo \"${line/:/'" "'}\"; done
Можно использовать эту простую команду:
cat input-file | sed 's/:/" "/' | sed 's/^/"/' | sed 's/$/"/'
Не забудьте заменять input-file
с Вашим реальным именем файла.
Если необходимо сохранить вывод в другой файл, затем добавляют перенаправление вывода, как это:
cat input-file | sed 's/:/" "/' | sed 's/^/"/' | sed 's/$/"/' > output-file
как прежде, не забудьте заменять output-file
с Вашим предпочтительным именем выходного файла.
... и это - все!;)
Используя 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"
Это не единственная командная строка, но можно сделать это в энергии: запишите макрос для изменения строки и движения вниз, повторение так же много раз как строки (я принимаю 1 000 строк),
qqI"<Esc>f:s"<Space>"<Esc>A"<Esc>jq1000@q