Как в Bash вывести строку в одну строку, используя разделитель?

Как в Bash вывести строку в одну строку, используя разделитель?

Я собрал данные с 3 полями. Я хочу вывести данные 3-го поля в одну строку. Вот данные, которые я получаю.

$ cat file
1234  1234  dei_1/3,dei_2/3,dei_9/0,
dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,de
i_9/7,dei_1/3,dei_2/3,dei_9/0

Ожидаемый результат:

1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0

Коды, которые у меня есть на данный момент

while read file; do if [[ $file == 1 ]]; then echo -n; fi; done 

решение1

Следующий скрипт объединяет с предыдущей строкой любую строку, которая не начинается с 2 цифр:

$ awk -v ORS="" '$1~/^[0-9]+$/ && $2~/^[0-9]+$/ && NR>1{printf "\n"}1' file
1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0

Это зависит от ORS(разделителя выходных записей), который сбрасывается на пустую строку. Новая строка добавляется, если первые 2 поля являются числами (и если это не первая строка).

решение2

Короткийsedподход:

sed -E 'N; s/\n([^[:space:]]*,[^[:space:]]+)/\1/' file

Выход:

1234  1234  dei_1/3,dei_2/3,dei_9/0,dei_10/0,dei_8/4
2345  2345  dei_8/9,dei_5/6,dei_4/9
4244  4244  dei_0/9,dei_4/6,dei_4/1
4235  4235  dei_0/9,dei_4/6,dei_4/,dei_9/7,dei_1/3,dei_2/3,dei_9/0

решение3

Пара подходов awk:

Сохраните последнюю строку, которая начинается с цифры, добавьте к ней, если текущая строка не начинается с цифры.

awk '
    /^[[:digit:]]/ {if (prev) print prev; prev=$0; next} 
    {prev = prev $0} 
    END {if (prev) print prev}
' file

Перевернуть файл. Если строка начинается не с цифры, прочитать следующую строку и добавить предыдущую. Перевернуть результаты. Я предполагаю, что запись разделена максимум 1 раз

tac file | awk '/^[^[:digit:]]/ {this = $0; getline; $0 = $0 this} 1' | tac

Связанный контент