Мой предыдущий ответ только что исправил ошибку. Вот как бы я ее решил:
Сценарий 4 самый сложный, поэтому вот решение:
echo '123|456|789' | sed 's/\([0-9]*\)|\([0-9]*\)|\([0-9]*\)/\1 \2 \3/'
\1, \2 и \3 в конце выбирают часть, совпадающую между «украшенными скобками» (\ (и \)). На каждый набор из них ссылается следующий номер, поэтому \1 для первого и т. д.
Для сценариев 1, 2 и 3 вы можете упростить это, но проще просто вырезать и вставить, а затем просто поставить \1, \2 или \3, как требуется, между последним набором //. Не помешает оставить там и остальные декорированные скобки.
Это решение может быть расширено до любого количества полей, хотя я, вероятно, предпочел бы использовать cut, если это возможно.
Это кажется простой задачей для SQL.
csv
+ sql
== csvsql
изcsvkit
!
Вы можете установить его через pip.
Прежде чем вы сможете начать, вам может потребоваться исправить файл перед выполнением этого :Удалите пустую строку и пробелы в конце каждой строки:
sed -i.bak '2d;s/[[:blank:]]*$//' file
Вы можете пройти половину пути с помощью:
csvsql \
-d' ' -S \
--query 'select cable,grnd_sta || "-" || chan_pdu,group_concat(fldr) from file group by cable' \
file \
| csvformat -D' '
-t
вместо -d' '
, если ваш файл разделен табуляцией. csvformat -D' '
для получения вывода с разделителями -, так как csvsql
выводит только разделители с запятыми -. С awk
работать проще, но csvsql заключит последний столбец в кавычки, а нам это не нужно! Выход:
cable "grnd_sta || ""-"" || chan_pdu" group_concat(fldr)
1 97-108 79,817,946
3 145-156 64,66,117,240,255,263,291
Отсюда вы можете продолжить использованиеawk
:
... \
| awk 'NR>1{printf "Cable %s\n\n%s\n%s\n\n",$1,$2,$3}' \
| head -n-1
Выход:
Cable 1
97-108
79,817,946
Cable 3
145-156
64,66,117,240,255,263,291
Я предлагаю сценарий Awk, содержащий все необходимые вычисления:
NR==1 { next }
NF==0 { next }
{ a[$2][1]= $5 "-" $6;
a[$2][2]= a[$2][2] $1 "," ; }
END { for (c in a) printf "Channel %d\n%s\n%s\n\n",c,a[c][1],a[c][2] }
использование:
$awk -f x.awk data
Channel 1
97-108
79,817,946,
Channel 3
145-156
64,66,117,240,255,263,291,