Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 当某些字段为空时,使用AWK从db查询列表中列出几列?_Shell_Awk - Fatal编程技术网

Shell 当某些字段为空时,使用AWK从db查询列表中列出几列?

Shell 当某些字段为空时,使用AWK从db查询列表中列出几列?,shell,awk,Shell,Awk,我试图使用awk有选择地显示db表中的几列(见下面的示例)。虽然没有填充所有字段,但我仍然需要返回一个空白字段来表示它 --------- -------------------------- ------------ ------ 000 0000000000198012 702 29 000 0000000000198013 29 000

我试图使用awk有选择地显示db表中的几列(见下面的示例)。虽然没有填充所有字段,但我仍然需要返回一个空白字段来表示它

--------- -------------------------- ------------ ------
000       0000000000198012           702          29
000       0000000000198013                        29
000                                  702          29
000       0000000000198015           702          03
055       0000000000000001           702          
这就是我正在使用的:

select * from db| awk '{print $1,$3,$4}'
但在有空白字段的行中,awk跳过这些字段并显示下一个填充字段的结果。如何准确显示结果


-谢谢

gawk
具有字段宽度

用法:
command|awk-f foo.awk

foo.awk

NR==1 {
    for (i=1; i<=NF; i++) {
      FIELDWIDTHS = FIELDWIDTHS " " length($(i))+1
    }
}

NR>1 {
    print $1, $3, $4
}
NR==1{
对于(i=1;i1{
打印$1、$3、$4
}

如果列具有一致的/静态宽度,并且间距是用“”字符处理的,而不是制表符(这意味着每一行的长度相同,而不管缺少字段),您可以使用
cut
和适当的字段开始/停止位置列表。

并不能直接回答您的问题,但这是一个非常好的线程。此外,除非您有某种方法确定一行中有一个或多个字段为空,否则您想要做的事情非常困难。请查看该线程。下面是一个可行的解决方案很好。但是您不能为SQL输出指定一个FieldSep吗?然后您可以检查
if($2==“”)…
。祝你好运。谢谢Florin,这是一个很好的链接,但你是对的,这不完全是我想要的。好的避难所,我将尝试看看我是否可以在DB2中做到这一点。抱歉,这是一个基本问题,但如果我在单个CLI上将sql查询传输到你的上述语句,我是否应该在前面加一个AWK?比如| AWK NR==1{…?只是一个快速更新,以防其他人搜索类似的解决方案,FIELDWIDTHS对我有效,但是由于我们的服务器构建标准“gawk”在目标服务器上不可用。因此我最终使用了“cut”(参见下一个答案)。但这是我的工作,但非常基本的代码:query | awk“BEGIN{FIELDWIDTHS=“9 1 48 1 12 1 6 1 24 1 3”}OFS=“;”{print$1,$3,$5,$7}我正在尝试此方法,但到目前为止一直出现语法错误和“stty:setattr:存在输入或输出错误”。我在shell脚本中使用的命令是:| awk'BEGIN-v FIELDWIDTHS=“9 48 12 6 24 3 30 6”{print$7}“
-v
选项不属于程序参数。请使用
awk-v FIELDWIDTHS=“…”{print$7}
awk'BEGIN{FIELDWIDTHS=“…”}{print$7}”“
。很抱歉,我本想回复slitvinov的帖子。谢谢你们也看了这篇文章!你们都很有帮助!由于我无法使用'gawk','cut'是下一个,它工作得很好!这是我的示例代码:myquery | cut-c1-9,11-48,60-68112-142143-159——输出分隔符=“;我唯一的问题是,关于“cut-c”中的字符范围,我正在手动列出每个字段的宽度。有更好的方法吗?例如,我有这个表的架构信息。如果我将“column length”放在一个平面文件中,并将其用作查找表来输入“cut-c”字符长度,这是最好的方法吗@twalberg@fembot我不知道有任何版本的
cut
具有这样的功能(这并不意味着可能不存在这样的功能)。但是,您可以将字符串“1-9,…143-159”在文件中,说
fields.txt
,然后执行
myquery | cut-c`cat fields.txt`
(或者,根据您使用的shell,
cut-c)$(