Как объединить строки в Unix (Sun Solaris) в определенном шаблоне

[

] Тот же самый вопрос. [

] [

] Об этом вопросе сообщается и подтверждается [] http://code.google.com/p/chromium/issues/detail?id=378303[][

]

1
15.04.2015, 07:28
2 ответа

Есть много способов сделать это.  Вот один из них, использующий только оболочку (никаких внешних программ):

#!/bin/sh
IFS=, read -r f1 f2
printf "%s,%s-%s" "$f1" "$f2" "$f2"
while IFS=, read -r f1 f2
do
    printf ",%s-%s" "$f2" "$f2"
done
printf "\n"

Поместите вышеперечисленное в файл с именем, скажем, myscript.sh, do chmod +x myscript.sh, и затем запустите ./myscript.sh с перенаправлением входных и выходных данных куда угодно.

Код прост

  • Считайте два поля, разделенных символом , .  Записывайте поле1 , field2 - field2, -, не , заканчивающееся новой строкой.
  • -, но не в конце файла, прочитайте два поля, разделенных строкой , .  Дважды перепишите второе, которому предшествует , , разделенное -, и не прекращена новой линией.
  • После того, как мы прочитали весь файл (дошли до конца файла), запишите новую строку.
1
27.01.2020, 23:37

Начиная с этого файла:

$ cat file
uk,1234560000
uk,6789067000
uk,4567890000

Если форматирование в вопросе верное, я считаю, что это делает то, о чем вы спрашиваете:

$ awk -F, '1==NR{printf "%s",$1} {printf ",%s-%s",$2,$2} END{print""}' file
uk,1234560000-1234560000,6789067000-6789067000,4567890000-4567890000

Как это работает

awk будет читать в записи (строке) одновременно. Каждая строка разделена на поля. В этом примере и запятой в качестве разделителя полей первое поле, называемое $1, всегда uk, а второе поле, называемое $2, является номером.

  • -F,

    Это заставляет awk рассматривать запятую как разделитель полей.

  • 1==NR{printf "%s",$1}

    NR - это количество прочитанных строк. Когда 1 == NR, мы находимся на первой строке. Когда мы находимся в первой строке, это говорит awk, чтобы вывести первое поле, uk.

  • printf ",%s-%s",$2,$2

    Для всех строк это означает, что awk выведет запятую, за которой последует второе поле, тире, и второе поле снова.

  • END{print""}

    When we reach the end of the file, this says awk to print a newline.

1
27.01.2020, 23:37

Теги

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