Perl 如何将数据解析为CSV文件中的唯一列

Perl 如何将数据解析为CSV文件中的唯一列,perl,csv,awk,Perl,Csv,Awk,因此,我有一个包含数千列的csv文件。例如,假设第一列作为服务器名称,其余列作为打开的端口 例如: 我正试图通过任何命令行工具找到一种方法,将其处理为独特的列,从而使上述内容成为: SERVER1,22,25,110,3389,,etc SERVER2,22,,110,3389,45001,etc SERVER3,,,,3389,45001,etc 欢迎提出任何意见。谢谢 你可以试试这个awk awk -F, ' NR==FNR{ for(i=2;i<=NF;i++) a[$i]

因此,我有一个包含数千列的csv文件。例如,假设第一列作为服务器名称,其余列作为打开的端口

例如:

我正试图通过任何命令行工具找到一种方法,将其处理为独特的列,从而使上述内容成为:

SERVER1,22,25,110,3389,,etc
SERVER2,22,,110,3389,45001,etc
SERVER3,,,,3389,45001,etc
欢迎提出任何意见。谢谢

你可以试试这个awk

awk -F, '
NR==FNR{
  for(i=2;i<=NF;i++)
  a[$i];
  next
}
{
  i=2;
  b=$1;
  for(j in a)
  {
    if($i == j)
    {
      b=b FS $i;
      i++
    }
    else
      b=b FS
  }
  print b
}
' infile infile
awk-F,'
NR==FNR{
对于(i=2;i你可以试试这个awk

awk -F, '
NR==FNR{
  for(i=2;i<=NF;i++)
  a[$i];
  next
}
{
  i=2;
  b=$1;
  for(j in a)
  {
    if($i == j)
    {
      b=b FS $i;
      i++
    }
    else
      b=b FS
  }
  print b
}
' infile infile
awk-F,'
NR==FNR{
对于(i=2;iperl

不要担心“etc”首先出现:端口按数字排序,字符串“etc”被视为数字零。

perl


不要担心“etc”首先出现:端口按数字排序,字符串“etc”被视为数字零。

GNU awk用于排序的输入:

$ cat tst.awk
BEGIN {
    FS=OFS=","
    PROCINFO["sorted_in"] = "@ind_num_asc"
}
NR==FNR {
    for (i=2; i<=NF; i++) {
        allVals[$i]
    }
    next
}
{
    delete curVals
    for (i=1; i<=NF; i++) {
        curVals[$i]
    }
    printf "%s", $1
    for (i in allVals) {
        printf "%s%s", OFS, (i in curVals ? i : "")
    }
    print ""
}

$ awk -f tst.awk file file
SERVER1,etc,22,25,110,3389,
SERVER2,etc,22,,110,3389,45001
SERVER3,etc,,,,3389,45001
$cat tst.awk
开始{
FS=OFS=“,”
PROCINFO[“排序在”]=“@ind\u num\u asc”
}
NR==FNR{

对于(i=2;i,GNU awk用于排序的_in:

$ cat tst.awk
BEGIN {
    FS=OFS=","
    PROCINFO["sorted_in"] = "@ind_num_asc"
}
NR==FNR {
    for (i=2; i<=NF; i++) {
        allVals[$i]
    }
    next
}
{
    delete curVals
    for (i=1; i<=NF; i++) {
        curVals[$i]
    }
    printf "%s", $1
    for (i in allVals) {
        printf "%s%s", OFS, (i in curVals ? i : "")
    }
    print ""
}

$ awk -f tst.awk file file
SERVER1,etc,22,25,110,3389,
SERVER2,etc,22,,110,3389,45001
SERVER3,etc,,,,3389,45001
$cat tst.awk
开始{
FS=OFS=“,”
PROCINFO[“排序在”]=“@ind\u num\u asc”
}
NR==FNR{

对于(i=2;我认为这一逻辑有问题,因为当
$i==j
时,你只会增加
i
,所以它不一定会测试所有字段。试试看……给定的数据没有问题,因为端口号是按顺序排列的。如果一行看起来像SERVER2,22785110338945001,那么你是对的,它是错的。我认为是这样的e在这个逻辑中有点错误,因为当
$i==j
时,你只会增加
i
,所以它不一定会测试所有字段。试试看……给定的数据没有问题,因为端口号是按顺序排列的。如果一行看起来像SERVER2,227885110338945001,那么你是对的,它是错的。你试过什么代码远?到目前为止你试过什么代码?
$ cat tst.awk
BEGIN {
    FS=OFS=","
    PROCINFO["sorted_in"] = "@ind_num_asc"
}
NR==FNR {
    for (i=2; i<=NF; i++) {
        allVals[$i]
    }
    next
}
{
    delete curVals
    for (i=1; i<=NF; i++) {
        curVals[$i]
    }
    printf "%s", $1
    for (i in allVals) {
        printf "%s%s", OFS, (i in curVals ? i : "")
    }
    print ""
}

$ awk -f tst.awk file file
SERVER1,etc,22,25,110,3389,
SERVER2,etc,22,,110,3389,45001
SERVER3,etc,,,,3389,45001