Согласно документации Ubuntu 18.04 под названием:Перемещение окна в другое рабочее пространство:
Использовать Миллера(https://github.com/johnkerl/miller)очень просто. Бег
mlr --csv fill-down -f CODE input.csv >output.csv
у вас будет
+------------+----------------+-----+-----+-----+-----+-----+-----+-----+--------+
| CODE | Sitting | Jan | Feb | Mar | Apr | May | Jun | Jul | Totals |
+------------+----------------+-----+-----+-----+-----+-----+-----+-----+--------+
| CLLK_J9 | First Sitting | - | - | 2 | 5 | 2 | - | - | 10 |
| CLLK_J9 | Second Sitting | - | - | - | - | - | - | - | 1 |
| RTHM_A8 | First Sitting | - | - | 1 | - | 3 | - | - | 6 |
| RTHM_A8 | Second Sitting | - | - | - | - | 1 | - | - | 1 |
| FFBJ_FA9 | First Sitting | - | - | - | 8 | 6 | - | - | 25 |
| FFBJ_FA9 | Second Sitting | - | - | - | - | 11 | - | - | 12 |
| UUYIOR_HJ9 | First Sitting | - | - | 1 | 3 | 6 | - | - | 17 |
| IKRO_Lk8 | First Sitting | - | - | - | 3 | 3 | - | - | 37 |
| IKRO_Lk8 | Second Sitting | - | - | - | 6 | 11 | - | - | 34 |
+------------+----------------+-----+-----+-----+-----+-----+-----+-----+--------+
Не решение AWK, но...
$ cat yourfile.csv | csv-sqlite 'select code, (select i2.code from input i2 where i2.code != "" and i2.rowid <= i1.rowid order by i2.rowid desc limit 1) as new_CODE, Sitting, Jan, Feb, Mar, Apr, May, Jun, Jul, Totals from input i1' -s
CODE new_CODE Sitting Jan Feb Mar Apr May Jun Jul Totals
CLLK_J9 CLLK_J9 First Sitting 2 5 2 10
CLLK_J9 Second Sitting 1
RTHM_A8 RTHM_A8 First Sitting 1 3 6
RTHM_A8 Second Sitting 1 1
FFBJ_FA9 FFBJ_FA9 First Sitting 8 6 25
FFBJ_FA9 Second Sitting 11 12
UUYIOR_HJ9 UUYIOR_HJ9 First Sitting 1 3 6 17
IKRO_Lk8 IKRO_Lk8 First Sitting 3 3 37
IKRO_Lk8 Second Sitting 6 11 34
(если вы отбросите " -s", он вернется как CSV)
csv -sqlite происходит отhttps://github.com/mslusarz/csv-nix-tools
Запрос был украден из этого ответа .
Если вы хотите попробовать это с awk
, следующее должно работать:
awk -F',' -v OFS=',' 'FNR>1{if ($1!="") last=$1; else $1=last}1' input.csv
Это установит разделители полей ввода и вывода на ,
.
Затем для каждой строки после первой строки(FNR>1
)будет проверяться, не пуст ли первый столбец ($1
). Если это не так, значение будет сохранено в переменной last
для последующего использования. Если он пуст, он будет заполнен ранее сохраненным значением.
1
вне блока правил {... }
дает указание awk
распечатать текущую строку, включая все сделанные модификации. Обратите внимание, что если не указана эта команда (или фактически какое-либо логическое условие, вычисляющее значение true
), или явная команда print
/ printf
не задана внутри блока правил, awk
не будет печатать текущую строку.
Результат:
CODE,Sitting,Jan,Feb,Mar,Apr,May,Jun,Jul,Totals
CLLK_J9,First Sitting,,,2,5,2,,,10
CLLK_J9,Second Sitting,,,,,,,,1
RTHM_A8,First Sitting,,,1,,3,,,6
RTHM_A8,Second Sitting,,,,,1,,,1
FFBJ_FA9,First Sitting,,,,8,6,,,25
FFBJ_FA9,Second Sitting,,,,,11,,,12
UUYIOR_HJ9,First Sitting,,,1,3,6,,,17
IKRO_Lk8,First Sitting,,,,3,3,,,37
IKRO_Lk8,Second Sitting,,,,6,11,,,34
Использование любого awk в любой оболочке на каждом компьютере UNIX:
$ awk 'BEGIN{FS=OFS=","} $1==""{$1=p} {p=$1} 1' file
CODE,Sitting,Jan,Feb,Mar,Apr,May,Jun,Jul,Totals
CLLK_J9,First Sitting,,,2,5,2,,,10
CLLK_J9,Second Sitting,,,,,,,,1
RTHM_A8,First Sitting,,,1,,3,,,6
RTHM_A8,Second Sitting,,,,,1,,,1
FFBJ_FA9,First Sitting,,,,8,6,,,25
FFBJ_FA9,Second Sitting,,,,,11,,,12
UUYIOR_HJ9,First Sitting,,,1,3,6,,,17
IKRO_Lk8,First Sitting,,,,3,3,,,37
IKRO_Lk8,Second Sitting,,,,6,11,,,34