【问题标题】:Using multiple arrays in Awk without duplication of code在 Awk 中使用多个数组而不重复代码
【发布时间】:2017-08-25 15:45:50
【问题描述】:

我有工作代码

BEGIN { FS=";"; }   # field separator
{ 
    if (match($2, /[0-9]+/)) {           # matching `ID` value
        m=substr($2, RSTART, RLENGTH);
        a[m]++;                          # accumulating number of lines for each `ID`
        print > m"_count.txt";    # writing lines pertaining to certain `ID` into respective file
    } 
}
END {
    for(i in a) { 
        print "mv "i"_count.txt "i"_"a[i]".txt"  # renaming files with actual counts
    }
} 

现在我需要改变它来做这样的事情。 所以我有三个 ID 数组,每个数组意味着单独的文件夹来保存结果。

BEGIN { FS=";"; }   # field separator
{
    array1=(125 258 698 874)
    array2=(956 887 4455 22)
    array3=(111 444 558 966 332)
    if ($1 == $2) {varR=$3} else {varR=$2}
    if (match(varR, /[0-9]+/)) {           # matching `ID` value
        if ( varR in array1 ) {
            FolderName = "folder1/"
            m1=substr(varR, RSTART, RLENGTH);
            a1[m1]++;                          # accumulating number of lines for each `ID`
            print > (FolderName m1)"_count.txt";    # writing lines pertaining to certain `ID` into respective file
        }
        if ( varR in array2 ) {
            FolderName = "folder2/"
            m2=substr(varR, RSTART, RLENGTH);
            a2[m2]++;                          # accumulating number of lines for each `ID`
            print > (FolderName m2)"_count.txt";    # writing lines pertaining to certain `ID` into respective file
        }
        if ( varR in array3 ) {
            FolderName = "folder3/"
            m3=substr(varR, RSTART, RLENGTH);
            a3[m3]++;                          # accumulating number of lines for each `ID`
            print > (FolderName m3)"_count.txt";    # writing lines pertaining to certain `ID` into respective file
        }
    } 
}
END {
    for(i in a1) { 
        print "mv "i"_count.txt "i"_"a1[i]".txt"  # renaming files with actual counts
    }
    for(i in a2) { 
        print "mv "i"_count.txt "i"_"a2[i]".txt"  # renaming files with actual counts
    }
    for(i in a3) { 
        print "mv "i"_count.txt "i"_"a3[i]".txt"  # renaming files with actual counts
    }
} 

因为我需要将匹配的 ID 保存到 txt 文件并放入所需的文件夹中 如果我有 100 个数组怎么办?我需要为每个重复代码吗?

【问题讨论】:

  • 如果没有详细阅读您的代码,为避免重复代码,您可以构建一个 awk 用户函数,您可以为每个数组调用该函数。请参阅此使用函数的示例:stackoverflow.com/questions/42415826/…

标签: arrays linux multidimensional-array awk gawk


【解决方案1】:

使用 GNU Awk 的多维数组支持,这里有一个简化的解决方案来演示您需要的技术:

$ gawk '
  BEGIN { FS=";" }   # field separator
  {
      # Initialize the sub-arrays of the multi-dimensional array.
      array[1][""]; split("125;258;698;874", aux); for (i in aux) array[1][aux[i]]
      array[2][""]; split("956;887;4455;22", aux); for (i in aux) array[2][aux[i]]
      array[3][""]; split("111;444;558;966;332", aux); for (i in aux) array[3][aux[i]]
      n = length(array) # The count of sub-arrays
      if ($1 == $2) {varR=$3} else {varR=$2}
      if (match(varR, /[0-9]+/)) {           # matching `ID` value
        for (i=1;i<=n;++i) {                 # loop over all arrays
          if (varR in array[i]) {            # look for the ID among the array keys
            print "folder" i
            break
          }
        }
      }        
  } 
' <<<'1;1;4455'
folder 2
  • 请参阅我的 this answer,了解此命令中使用的数组初始化和多维数组技术的说明。

  • 请注意,数组初始化将数字存储在数组array[&lt;n&gt;] 中,因为这是使用&lt;value&gt; in array[&lt;n&gt;] 查找值所需要的。


你尝试了什么

  • Awk 没有数组初始化语法; array1=(125 258 698 874) 在您的代码中创建的是一个单个字符串"125258698874"

    • 周围的() 在这里不起作用(它们只是为了优先)。
    • 在 Awk 中将标记(无论是数字还是字符串)并排放置会执行字符串连接
    • 也许您错误地认为 Bash 的数组初始化器语法也适用于 Awk。
  • ( varR in array1 )array1索引(键)中查找varR,但是如果您的数组初始化工作方式与在 Bash 中的方式相同,则您必须改为检查

【讨论】:

    【解决方案2】:

    您是否需要使用不同的数组,或者您可以这样做:

    a[1","1] = "abc";
    a[1","2] = "xyz";
    a[2","2] = "123";
    folders[1] = "folder1";
    folders[2] = "folder2";
    var = "1";
    for (f in folders) {
        if (var","f in a) {
            print a[var","f] " >> " folders[f] "/file_" var;
        }
    }
    

    【讨论】:

    • 我的数组只是数字,我只需要将它们用于匹配 ID,并根据将结果放入文件夹,其名称取决于数组编号
    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多