该脚本似乎删除了以字母开头的代码。当我用 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