有趣的 awk 问题

有趣的 awk 问题

该脚本似乎删除了以字母开头的代码。当我用 3420 替换 P3420 时,脚本按预期工作。不知道发生了什么

输入:

99443 - PHYS 电话 E/M 21-30 分钟,,,,306,,,,

第2341章,格巴哈,蝙蝠侠,01/12/2005,01/10/2005,,230.04,100.00,0.00,

第3678章,德斯特法,闪光,01/27/2005,02/02/2005,,230.04,100.00,130.04,

99443 - PHYS 电话 E/M 21-30 分钟总计:,,,,306,,,,

P3420 B12 注射 - B12 注射,,,,15,,,,

第3437章,戈多,09/04/2002,09/12/2002,,10.00,10.00,0.00,

第3513章

脚本:

while read line
do
    # Debugging:
    if [ -z "$(echo "$line" | awk -F"," '{ print $3 }')" ]
    then
            #echo "$line"
            #if [ echo "$line" | grep '-' ]
            #then
                   var=$(echo "$line" | grep '-' | cut -d" " -f1)
                    echo $var
    fi

    if [ -n "$(echo "$line" | awk -F"," '{ print $3 }')" ]

    then
            echo "$line" | awk -F"," '{ $6='$var';print }' >> testingfile.txt


    fi
 done < $1

输出:

2341 格巴蝙蝠侠 2005/12/01 2005/13/0199443230.04 100.00 0.00

3678 德斯特法闪光 01/27/2005 02/04/200599443230.04 100.00 130.04

3437 查普·戈登 09/04/2002 09/13/2002 10.00 10.00 0.00

第3513章 萨佐阿哈阿 10/08/2002 10/08/2002 10.00 0.00 10.00

答案1

哇!让我们尝试猜测这个脚本想要做什么。

外部while read循环一次读取一行文件,连接以\.

第一个测试查看第三个逗号分隔字段是否为空,如果是,则设置为空(如果行中var没有字符),或者设置为第一个空格之前的字符。-然后打印 var。

第二个测试查看第三个逗号分隔字段是否不为空。不清楚为什么再次测试而不是仅仅使用else.第 6 个逗号分隔字段设置为 的值$var,并打印该行。

因此,如果该行命中第一个测试并以 开头,P3420 B12则 var 将设置为P3420。第二个 awk 命令看起来像

awk '-F,' '{$6=P3420;print}'

并且没有名为 P3420 的变量,因此它默认为空字符串。如果P删除然后$6=3420分配一个整数,一切都很好。所以,你的问题的根源是缺乏引用。命令应该是

awk '-F,' '{$6="'$var'";print}'

每行至少运行 4 个进程是相当昂贵的! Unix 进程很便宜,但也不是那么便宜!整个文件可以用一个 awk 进程来处理。

要在输出中保留逗号,请在 BEGIN 块中添加对 OFS 的赋值

awk -F',' 'BEGIN { OFS="," }
           $3!="" { $6=zone; print }
           $3=="" { split($1,a,/ /) ; zone=a[1] }' $1

相关内容