首页 > 解决方案 > Awk regex substring in column

问题描述

I have a data file with comma-separated fields:

379565,COFFEE,297678,      ,21,21,I, 6,  10.00,               ,     ,                            ,01-DISPLAY REVENUE  ,17-HOUSE ACCOUNT    ,AD#05260540         ,YES               ,N,N,20210625,
380685,COMICS,297634,      ,21,21,I, 3,  21.00,MAIN NEWS      ,     ,BATHS                       ,01-DISPLAY REVENUE  ,17-HOUSE ACCOUNT    ,AD# IS 05240526     ,YES               ,N,N,20210625,
337708,COMICS,298047, 84558,21,21,I, 6,  21.00,               ,     ,SCHOOL PAGE                 ,01-DISPLAY REVENUE  ,17-HOUSE ACCOUNT    ,                    ,CMYK              ,N,N,20210625

When column 4 only has spaces, the 8-digit ad number needs to be pulled from column 15.

This awk checks to see if column 4 is only spaces and, if so, copies column 15 to 4:

awk -F, '{ if ($4 ~ /^[[:space:]][[:space:]][[:space:]][[:space:]][[:space:]][[:space:]]/) {OFS=",";{$4=$15} print} else print}'

How can I extract just the 8-digit ad number (without the "AD#" or "AD# IS" parts) from column 15 and put into column 4?

Expected outcome:

379565,COFFEE,297678,05260540,21,21,I, 6,  10.00,               ,     ,                            ,01-DISPLAY REVENUE  ,17-HOUSE ACCOUNT    ,AD#05260540         ,YES               ,N,N,20210625,
380685,COMICS,297634,05240526,21,21,I, 3,  21.00,MAIN NEWS      ,     ,BATHS                       ,01-DISPLAY REVENUE  ,17-HOUSE ACCOUNT    ,AD# IS 05240526     ,YES               ,N,N,20210625,
337708,COMICS,298047, 84558,21,21,I, 6,  21.00,               ,     ,SCHOOL PAGE                 ,01-DISPLAY REVENUE  ,17-HOUSE ACCOUNT    ,                    ,CMYK              ,N,N,20210625

标签: awk

解决方案


You may use this awk:

awk 'BEGIN{FS=OFS=","} $4 ~ /^[[:blank:]]*$/ {$4 = $15; gsub(/[^[:digit:]]+/, "", $4)} 1' file

379565,COFFEE,297678,05260540,21,21,I, 6,  10.00,               ,     ,                            ,01-DISPLAY REVENUE  ,17-HOUSE ACCOUNT    ,AD#05260540         ,YES               ,N,N,20210625,
380685,COMICS,297634,05240526,21,21,I, 3,  21.00,MAIN NEWS      ,     ,BATHS                       ,01-DISPLAY REVENUE  ,17-HOUSE ACCOUNT    ,AD# IS 05240526     ,YES               ,N,N,20210625,
337708,COMICS,298047, 84558,21,21,I, 6,  21.00,               ,     ,SCHOOL PAGE                 ,01-DISPLAY REVENUE  ,17-HOUSE ACCOUNT    ,                    ,CMYK              ,N,N,20210625

An expanded form:

awk '
BEGIN {FS=OFS=","}
$4 ~ /^[[:blank:]]*$/ {
   $4 = $15
   gsub(/[^[:digit:]]+/, "", $4)
}
1' file

推荐阅读