繁体   English   中英

在 Shell 中循环遍历逗号分隔的行

[英]Iterating through Comma Separated rows in loop in Shell

最终版.txt

Failed,2021-12-07 22:30 EST,Scheduled Backup,abc,/clients/FORD_1030PM_EST_Windows2008,Windows File System
Failed,2021-12-07 22:00 EST,Scheduled Backup,def,/clients/FORD_10PM_EST_Windows2008,Windows File System

我想遍历这些行而不是列

预计 Output

client=abc
client=def
group=/clients/FORD_1030PM_EST_Windows2008
group=/clients/FORD_10PM_EST_Windows2008

我试过这个

while read line ; do 
    group=$(awk -F',' '{print $4}')
    client=$(awk -F',' '{print $5}')
    echo $group
    echo $client
done < Final

它不起作用,但是当我单独这样做时

cat Final | awk -F',' '{print $4}'

然后它给了我预期的 output 但在我尝试循环时不起作用。

一次通过awk解决方案,将字段$5存储在数组中以用于最后打印:

$ awk -F, '{print $4; groups[NR]=$5} END {for (i=1;i<=NR;i++) print groups[i]}' Final.txt
abc
def
/clients/FORD_1030PM_EST_Windows2008
/clients/FORD_10PM_EST_Windows2008

两遍awk消除了将字段$5存储在数组中的需要:

$ awk -F, 'FNR==NR {print $4;next} {print $5}' Final.txt Final.txt
abc
def
/clients/FORD_1030PM_EST_Windows2008
/clients/FORD_10PM_EST_Windows2008

与 bash

declare -a client group
while IFS=, read -ra fields; do 
    client+=("${fields[3]}")
    group+=("${fields[4]}")
done < Final
printf 'client=%s\n' "${client[@]}"
printf 'group=%s\n' "${group[@]}"

使用 ,它与单程 awk 解决方案没有什么不同,收集 arrays 中的值:

mlr --icsv --implicit-csv-header put '
    @client[NR] = $4;
    @group[NR] = $5;
    filter false;
    end {
        emit @client, "client";
        emit @group, "group";
    }
' Final

与上述等效,更易读(IMO)awk 代码:

awk -F, '
    {client[NR] = $4; group[NR] = $5}
    END {
        for (i=1; i<=NR; i++) print "client=" client[i]
        for (i=1; i<=NR; i++) print "group=" group[i]
    }
' Final

使用csvtool很好,因为它有一个转置 function,但它仍然需要帮助才能达到所需的 output

csvtool col 4,5 Final \
| csvtool cat <(echo "client,group") - \
| csvtool transpose - \
| awk -F, -v OFS="=" '{for (i=2; i<=NF; i++) print $1, $i}'

使用 GNU awk:

awk -F ',' 'BEGINFILE{f++}
            f==1{print "client=" $4}
            f==2{print "group=" $5}
           ' Final Final

Output:

client=abc
client=def
grooup=/clients/FORD_1030PM_EST_Windows2008
grooup=/clients/FORD_10PM_EST_Windows2008
LOG="Failed,2021-12-07 22:30 EST,Scheduled Backup,abc,/clients/FORD_1030PM_EST_Windows2008,Windows File System
Failed,2021-12-07 22:00 EST,Scheduled Backup,def,/clients/FORD_10PM_EST_Windows2008,Windows File System"

getColumnTextSed(){
        log="$1"
        column=$2
        [ -n "$log" -a -n "$column" ]  && sed -E 's/([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),(.*)/\'$column'/mg;t;d' <<<$log
}
getColumnTextAWK(){
        log="$1"
        column=$2
        [ -n "$log" -a -n "$column" ]  && awk -F',' -v "c=$column" '{print $(c)}' <<<$log
}



echo "# with sed and column number"
echo "-------------------------------"
getColumnTextSed "$LOG" 4
getColumnTextSed "$LOG" 5
echo "-------------------------------"

echo "# with awk and column number"
echo "-------------------------------"
getColumnTextAWK "$LOG" 4
getColumnTextAWK "$LOG" 5

OUTPUT
# with sed
-------------------------------
abc
def
/clients/FORD_1030PM_EST_Windows2008
/clients/FORD_10PM_EST_Windows2008
-------------------------------
# with awk
-------------------------------
abc
def
/clients/FORD_1030PM_EST_Windows2008
/clients/FORD_10PM_EST_Windows2008

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM