Рейтинг:0

изменить определенные столбцы на основе другого столбца с помощью awk и gsub

флаг bt

У меня есть файл (file1) с миллионами строк и столбцов. Пример данных:

"столб1", "столб2", "столб3", "столб4", "столбец5", "столб6"
"ААА",0,5,10,"БГБ",50
"ВВВ",4,7,10,"БФД",76
"ААА",15,0,0,"БГБ",20
"ААА",10,13,10,"ДДД",23

Я хочу найти все строки с AAA в col1, а затем получить все строки с BGB в col5. И, наконец, уменьшите на 50% каждое значение в столбцах col2, col3, col4 и col6 (игнорируйте, если значения ячеек равны 0 или пусты). И распечатайте все строки файла. Итак, мой вывод будет выглядеть следующим образом:

"столб1", "столб2", "столб3", "столб4", "столбец5", "столб6"
"ААА",0,2,5,5,"БГБ",25
"ВВВ",4,7,10,"БФД",76
"ААА",7.5,0,0,"БГБ",10
"ААА",10,13,10,"ДДД",23

Я пробовал следующее, но не мог заставить его работать (также не мог понять, как использовать несколько столбцов в gsub)

grep AAA-файл1 | awk -F "," '$5~/BGB/ {gsub($6,\substr($6,1,length($6)-1)*0,50\, $6}1'
ChanganAuto avatar
флаг us
Какое это имеет отношение к Ubuntu?
NotTheDr01ds avatar
флаг vn
Или подсистема Windows для Linux (как указано)?
Рейтинг:1
флаг cn

awk может сопоставлять шаблоны, как это делает grep, поэтому вам почти никогда не понадобятся grep и awk в конвейере.

Вы могли бы сделать

 хорошо '
    НАЧАЛО {FS = OFS = ","}
    $1 ~ /AAA/ && $5 ~ /BGB/ {
        если (2 доллара) 2 доллара = 2 доллара / 2
        если (3 доллара) 3 доллара = 3 доллара / 2
        если (4 доллара) 4 доллара = 4 доллара / 2
        если (6 долларов) 6 долларов = 6 долларов / 2
    }
    1
' файл

Или, если вы хотите сделать столбцы для сокращения более динамичными

awk -v "столбцы = 2,3,4,6" '
    НАЧИНАТЬ {
        ФС = ОФС = ","
        n = разделить (столбцы, а, /, /)
        для (i=1; i<=n; i++) cols[a[i]]=1
    }
    $1 ~ /AAA/ && $5 ~ /BGB/ {
        для (c в столбцах), если ($c) $c = $c / 2
    }
    1
' файл

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.