Проблемы создания awk между диапазонами столбцов - PullRequest
0 голосов
/ 28 мая 2019

У меня есть файл с именем sds

$head sds
2557 386 fs://name/user/hive/ware/doc1/do_fact/date=20190313/fact=6
2593 393 fs://name/user/hive/ware/toc1/do_gas/idi_centr=6372/mes=20
2594 343 fs://name/user/hive/ware/dac2/do_gas2/idi_centr=6354/mes=21
349  307 fs://name/user/hive/ware/tec2/do_des/mes=25
340  332 fs://name/user/hive/ware/dc1/venta/year=2018/month=12

Я хочу удалить /user/hive/ware и заменить $7 ~ /_1$ для 1 и other $7 для 2, используя awk.

Код, который я использовал, был:

awk -F"/" '{ if ($7 ~ /_1$/)
print $1"//"$3"/1/"$7-$NF
else
print $1"//"$3"/2/"$7-$NF}' sds

, но результат плохой.

Я хотел бы и вывел:

2557 386 fs://name/1/do_fact/date=20190313/fact=6
2593 393 fs://name/1/do_gas/idi_centr=6372/mes=20
2594 343 fs://name/2/do_gas2/idi_centr=6354/mes=21
349  307 fs://name/2/do_des/mes=25
340  332 fs://name/1/venta/year=2018/month=12

Ответы [ 3 ]

0 голосов
/ 28 мая 2019
$ awk 'BEGIN{FS=OFS="/"} {sub("/user/hive/ware",""); $4=($4~/1$/ ? 1 : 2)} 1' file
2557 386 fs://name/1/do_fact/date=20190313/fact=6
2593 393 fs://name/1/do_gas/idi_centr=6372/mes=20
2594 343 fs://name/2/do_gas2/idi_centr=6354/mes=21
349  307 fs://name/2/do_des/mes=25
340  332 fs://name/1/venta/year=2018/month=12

или если вы ДЕЙСТВИТЕЛЬНО не хотите удалять строку /user/hive/share и вместо этого хотите удалить поля с 4 по 6 независимо от их значения:

$ awk 'BEGIN{FS=OFS="/"} {$4=$5=$6="\n"; sub(/(\/\n){3}/,""); $4=($4~/1$/ ? 1 : 2)} 1' file
2557 386 fs://name/1/do_fact/date=20190313/fact=6
2593 393 fs://name/1/do_gas/idi_centr=6372/mes=20
2594 343 fs://name/2/do_gas2/idi_centr=6354/mes=21
349  307 fs://name/2/do_des/mes=25
340  332 fs://name/1/venta/year=2018/month=12
0 голосов
/ 28 мая 2019

с sed

$ sed -E 's_/user/hive/ware/[^/]+(.)/_/\1/_' file

2557 386 fs://name/1/do_fact/date=20190313/fact=6
2593 393 fs://name/1/do_gas/idi_centr=6372/mes=20
2594 343 fs://name/2/do_gas2/idi_centr=6354/mes=21
349  307 fs://name/2/do_des/mes=25
340  332 fs://name/1/venta/year=2018/month=12

на самом деле это не условная замена.

0 голосов
/ 28 мая 2019

Вы можете использовать awk и его функцию gsub для замены выбранных столбцов.

 awk 'BEGIN{FS=OFS="/"}{gsub("user/hive/ware/","");gsub(/^[^12]+/,"",$4)}1' inputfile
2557 386 fs://name/1/do_fact/date=20190313/fact=6
2593 393 fs://name/1/do_gas/idi_centr=6372/mes=20
2594 343 fs://name/2/do_gas2/idi_centr=6354/mes=21
349  307 fs://name/2/do_des/mes=25
340  332 fs://name/1/venta/year=2018/month=12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...