Сортировка и редактирование текстового файла для вывода нового файла

Мой предыдущий ответ только что исправил ошибку. Вот как бы я ее решил:

Сценарий 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, если это возможно.

2
09.07.2019, 07:38
2 ответа

Это кажется простой задачей для 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
1
27.01.2020, 22:16

Я предлагаю сценарий 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,
0
27.01.2020, 22:16

Теги

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