【问题标题】:Delete useless/empty line with my awk script用我的 awk 脚本删除无用/空行
【发布时间】:2019-07-25 14:46:37
【问题描述】:

对于我在 bash/html 中的 CGI,我有这个脚本(只是 awk 脚本,其余代码只是一个简单的 hmtl 代码):

for fn in /var/www/cgi-bin/LPAR_MAP/*; do
    awk -F',|;' 'NR==1 { split(FILENAME ,a,"[-.]");
       print "DATE ========================== : " a[4] }
       /'$test'/ { 
           print ""
           print "LPARS :" $2
           print "RAM : " $5
           print "CPU 1 : " $6
           print "CPU 2 : " $7
           print "" 
           print ""}' $fn;
done

我的脚本分析许多 CSV 文件并显示我需要的信息:

DATE ========================== : 20180122

LPARS :miaibye01
RAM : 60
CPU 1 : 1.0
CPU 2 : 2



LPARS :miaibg04
RAM : 99
CPU 1 : 1.5
CPU 2 : 3



LPARS :miaibk07
RAM : 52
CPU 1 : 2.5
CPU 2 : 5

DATE ========================== : 20180124

LPARS :miaibye01
RAM : 60
CPU 1 : 1.0
CPU 2 : 2



LPARS :miaibg04
RAM : 99
CPU 1 : 1.5
CPU 2 : 3



LPARS :miaibk07
RAM : 52
CPU 1 : 2.5
CPU 2 : 5



LPARS :miaibv176
RAM : 0.25
CPU 1 : 0.1
CPU 2 : 1

...

但有时,当我的脚本没有找到所询问的信息时,它会显示所询问的信息并显示脚本搜索信息的文件的日期。输出是:

DATE ========================== : 20180923
DATE ========================== : 20180924
DATE ========================== : 20180925
DATE ========================== : 20180926
DATE ========================== : 20180927
DATE ========================== : 20180928
DATE ========================== : 20180929
DATE ========================== : 20180930
DATE ========================== : 20181001

我用我的 awk 脚本搜索了如何删除(或不显示)这些无用的行,但我不知道如何......你有什么想法吗?

【问题讨论】:

    标签: linux bash csv awk


    【解决方案1】:

    你可以这样做:

    for fn in /var/www/cgi-bin/LPAR_MAP/*; do
        awk -F',|;' -v test="$test" '
           NR==1 { 
             split(FILENAME ,a,"[-.]");
           }
           $0 ~ test {
               if(!header++){
                   print "DATE ========================== : " a[4] 
               }
               print ""
               print "LPARS :" $2
               print "RAM : " $5
               print "CPU 1 : " $6
               print "CPU 2 : " $7
               print "" 
               print ""
           }' $fn;
    done
    

    我只在 $0 ~ $test 的第一次打印标题。 请注意,我对您的代码进行了一些更改,以创建一个等于$test 的 awk 变量。代码注入会更加健壮。

    【讨论】:

    • 谢谢@EdMorton!
    • 您好!您的解决方案效果很好,但正如您在此处看到的(image.noelshack.com/fichiers/2019/30/5/1564126963-nbvc.png),即使没有显示无用的行,表格仍然会生成!你有什么办法解决这个问题吗?
    • 我没有关于该图像的任何上下文...你从哪里得到的?
    • 您好!使用您的脚本,如果我的脚本找不到信息,则可以不显示“ Date ====== XXX ”行。但是,即使没有信息,仍然会生成并显示应该接收信息的html列(即图片右侧的空列)
    • 我不知道你是如何生成这些 html 列的。我认为我们应该看到其余的代码,如果您使用适当的标签添加其他问题,它可能更具可读性。
    【解决方案2】:

    你不需要一个shell循环,你只需要:

    awk -F'[,;]' -v test="$test" '
        FNR==1 { doneHdr = 0 }
        $0 ~ test {
            if ( !doneHdr++ ) {
                split(FILENAME,a,/[-.]/)
                print "DATE ========================== : " a[4]
            }
            print ""
            print "LPARS :" $2
            print "RAM : " $5
            print "CPU 1 : " $6
            print "CPU 2 : " $7
            print "" 
            print ""
        }
    ' /var/www/cgi-bin/LPAR_MAP/*
    

    【讨论】:

    • 您好!谢谢您的帮助 !很有帮助!!你能快速解释一下这些行的功能吗:"test="$test"' FNR==1 { doneHdr = 0 } $0 ~ test { if (!doneHdr++)"?非常感谢!
    • -v test="$test" 正在将一个名为 test 的 awk 变量设置为您现有的也名为 test 的 shell 变量的值 - 请参阅 cfajohnson.com/shell/cus-faq-2.html#Q24$0 ~ test 只是为您现有的/'$test'/ 更正了语法。 ` ' FNR==1 { doneHdr = 0 }` 在开始读取每个新输入文件时清除一个标志。 if ( !doneHdr++ ) x 将执行 x 并在第一次命中时将标志设置为 1,之后 x 将不会在标志非零时再次执行(即对于当前输入文件的其余部分)。
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 2011-02-22
    • 2012-05-08
    • 2010-12-11
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多