Csv 如何使用命令删除awk脚本中的重复行?

Csv 如何使用命令删除awk脚本中的重复行?,csv,awk,cgi,Csv,Awk,Cgi,我在bash/html中创建了一个CGI 我的awk脚本如下所示: echo "<p><h2>FRAME : $test</h2></p>" echo "<table>" for fn in /var/www/cgi-bin/LPAR_MAP/*; do echo "<td>" echo "<PRE>" awk -F',|;' -v test="$test" ' NR==1 { s

我在bash/html中创建了一个CGI

我的awk脚本如下所示:

echo "<p><h2>FRAME : $test</h2></p>"

echo "<table>"
for fn in /var/www/cgi-bin/LPAR_MAP/*;
do
echo "<td>"
echo "<PRE>"

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;



echo "</PRE>"
echo "</td>"
done
echo "</table>"
MO2PPC20;mo2vio20b;Running;VIOS 2.2.5.20;7;1.0;2;DefaultPool;shared;uncap;192
MO2PPC20;mo2vio20a;Running;VIOS 2.2.5.20;7;1.0;2;DefaultPool;shared;uncap;192
MO2PPC21;mplaix0311;Running;AIX 7.1 7100-05-02-1832;35;0.6;4;DefaultPool;shared;uncap;64
MO2PPC21;miaibv194;Running;AIX 6.1 6100-09-11-1810;11;0.2;1;DefaultPool;shared;uncap;64
MO2PPC21;mplaix0032;Running;AIX 6.1 6100-09-11-1810;105;4.0;11;DefaultPool;shared;uncap;128
MO2PPC21;mplaix0190;Running;Unknown;243;4.9;30;DefaultPool;shared;uncap;128
MO2PPC21;mo2vio21b;Running;VIOS 2.2.6.10;6;1.5;3;DefaultPool;shared;uncap;192
MO2PPC21;miaibv238;Running;AIX 7.1 7100-05-02-1810;10;0.5;1;DefaultPool;shared;uncap;64
MO2PPC21;mo2vio21a;Running;VIOS 2.2.6.10;6;1.5;3;DefaultPool;shared;uncap;192
MO2PPC21;miaibv193;Running;AIX 6.1 6100-09-11-1810;12;0.2;1;DefaultPool;shared;uncap;64
MO1PPC17;miaibe03;Running;AIX 5.2 5200-10-08-0930;25;null;3;null;ded;share_idle_procs;null
MO1PPC17;miaiba12;Running;AIX 5.2 5200-10-08-0930;17;null;2;null;ded;share_idle_procs;null
MO1PPC17;miaibf03;Running;AIX 5.2 5200-10-08-0930;30;null;3;null;ded;share_idle_procs;null
MO1PPC17;miaibc05;Running;AIX 5.2 5200-10-08-0930;40;null;2;null;ded;share_idle_procs;null
要在我的CGI中显示它们,如下所示:

列数与要分析的csv数相等

正如您在屏幕截图中看到的,每个csv文件中的某些行有时是相同的

其想法是删除所有csv文件中相同的行

我知道awk命令:

awk '!a[$0]++'
但是这个命令需要一个文件来实现


您认为可以将此命令放在我的awk脚本中吗?

使用awk一次读取所有文件并添加条件:

awk -F',|;' -v test="$test" '
 BEGIN{
    print "<table>"
 }
 FNR==1 {
    if(close_tag++){
            print "</PRE>"
            print "<td>"
    }
    print "<td>"
    print "<PRE>"
    split(FILENAME ,a,"[-.]");
  }
  ($0 ~ test) && (!dup[$0]++) {
      if(!header++){
          print "DATE ========================== : " a[4] 
      }
      print ""
      print "LPARS :" $2
      print "RAM : " $5
      print "CPU 1 : " $6
      print "CPU 2 : " $7
      print "" 
      print ""
  }
  END{
      print "</PRE>"
      print "</td>"
      print "</table>"
  }' /var/www/cgi-bin/LPAR_MAP/*
awk-F',|'-v test=“$test””
开始{
打印“”
}
FNR==1{
如果(关闭标签++){
打印“”
打印“”
}
打印“”
打印“”
拆分(文件名,a,“[-.]”);
}
($0~测试)和(!dup[$0]++){
如果(!header++){
打印“日期===================================:”a[4]
}
打印“”
打印“LPAR:$2
打印“RAM:$5”
打印“CPU 1:$6
打印“CPU 2:$7
打印“”
打印“”
}
结束{
打印“”
打印“”
打印“”
}'/var/www/cgi-bin/LPAR\u-MAP/*

我不知道你说的“但是这个命令需要一个文件”是什么意思。
awk
读取数据行,这些行可以通过脚本后面的文件名、脚本前后的重定向以及管道来提供。例如,
awk'!一个[$0]+'文件
awk'!一个[$0]++“
Hello!:)我的意思是命令应该看起来像'awk'!a[$0]++“file.txt`。但在我的情况下,我无法创建一个大文件并应用该命令。这就是为什么我想将它放在我的awk script.Hm.中。我仍然不清楚。你的意思是
awk-f myAwkScript file.txt
?只需创建脚本文件并这样调用它。或者1)在顶部包含正确的路径,并使用
。!/bin/awk-f
2)使其执行可以使用
chmod+x myAwkScript
进行编辑,然后像
/myAwkScript file.txt
那样运行。所有其他选项
等仍然适用于此表单。祝你好运。对不起,我是法国人,所以英语说得不太好(我想这就是你理解困难的原因)。简言之,命令
awk'!a[$0]++“
只适用于
awk'!一个[$0]++file.txt
,或者类似的东西,对吗?我不能这样做,因为我有276个文件..我不能做
awk'!一个[$0]++'1.csv…276.csv
,这就是为什么我想在我的awk脚本中使用它…可能我不理解此命令的工作原理。好的,这是一个很有帮助的解释(请不要担心您的语言技能,除了
c
和shell脚本语言之外,我对任何语言都不熟悉;-))。是的,您可以在命令行上提供多个文件,但有一些限制。如果您确实“仅”有276个文件(并且文件名较短),您应该能够
cd/path/to/data;awk'!a[$0]+'*.csv>all;mv all.csv
。如果您的文件名很长,(或者您有2000多个文件)您可能会达到shell在一行cmd上处理的极限…您好!如果我尝试您的建议,我会得到以下结果:某个地方有问题,但我不知道在哪里…无论如何感谢您的帮助!:)编辑,您需要删除
for
循环,并使用
awk
立即读取所有文件。这将删除在所有文件中出现第二次和后续时间的行,OP希望删除在所有3个文件中出现1次或多次的行。如果我正确理解OPs的需要,则条件需要类似于
!(file1[$0]&&file2[$0]&&file3[$0])
使用一些其他代码来填充每个输入文件的数组,而不是
!dup[$0]++
,这意味着您必须读取所有文件两次—一次识别所有输入文件中的公共块,然后再次处理所有块。