【问题标题】:Deleting Column Selection in AWK在 AWK 中删除列选择
【发布时间】:2011-12-03 12:05:47
【问题描述】:

我想从 CSV 文件列表中删除选择的列。 awk 调用是内联的,因为它在 shell 脚本中使用。我事先不知道这些文件有多少列,只知道我想要删除的列包含在列表的每个文件中。

假设我想删除前 4 列。删除列值会留下分隔符,我也想去掉。

尽管以下方法可行:创建要删除的列号数组,然后重新创建没有这些列的相应行。

下面的length(row)值符合预期,但最终循环仍然迭代原始列数,而不是实际的length(row)值。

头 $f | awk 'BEGIN{FS=",";split("1,2,3,4",dropers,",")}{split($0,row,FS);for(i in dropers) 删除行[i] ;打印 NF ","length(row) ">>";for(i=1;i $g

或格式化:

head $f | awk 'BEGIN{FS=",";split("1,2,3,4",dropers,",")}{split($0,row,FS);for(i in dropers) delete row[i]; print NF "," length(row) "<<<";out=""; print NF "," length(row) ">>>";for(i=1;i<=length(row);i++){print row[i] "lulu"; out = out "," row[i]}; sub(/[ \t]*$/,"",out);print out}'  > $g

这是 2 个文件的输出:进入 6 列,当我删除第 1 到第 4 列时剩下 2 列,但循环遍历完整的 6 列而不是预期的 2。感谢您的任何建议。

澳大利亚。

6,2<<<
6,2>>>
lulu
lulu
lulu
lulu
0000009lulu
461474lulu
,,,,,0000009,461474
6,2<<<
6,2>>>
lulu
lulu
lulu
lulu
0000010lulu
94942lulu
,,,,,0000010,94942

编辑(贝利撒留)
格式化代码如下:

BEGIN {FS=",";
       split("1,2,3,4",dropers,",")
      }

{ split($0,row,FS);
  for(i in dropers) delete row[i]; 
  print NF "," length(row) "<<<";
  out=""; 
  print NF "," length(row) ">>>";
  for(i=1;i<=length(row);i++){print row[i] "lulu"; 
                              out = out "," row[i]}; 
  sub(/[ \t]*$/,"",out);
  print out
}

【问题讨论】:

    标签: awk


    【解决方案1】:
    BEGIN {FS=",";
           split("1,2,3,4",dropers,",")
          }
    
    { split($0,row,FS);
      for(i in dropers) delete row[i]; 
      print NF "," length(row) "<<<";
      out=""; 
      print NF "," length(row) ">>>";
      for(i in row){print row[i] "lulu"; 
                    out = out "," row[i]}; 
      out = substr(out,2)
      sub(/[ \t]*$/,"",out);
      print out
    }
    

    带输入:

    a,b,c,d,e,f,g
    

    打印:

    7,3<<<
    7,3>>>
    elulu
    flulu
    glulu
    e,f,g
    

    【讨论】:

    • 感谢您的回答。我接到 substr(out,2) 电话。我仍然不清楚为什么 for(i in row) 的迭代次数少于 for(i=1;i
    • @auduf 那是因为它们是关联数组!
    • 如果length(row)=2,for(i=1;i
    • @auduf 确实如此。我以前犯过这个错误,似乎永远学不会。请参阅stackoverflow.com/questions/5036787/…,以及 Dennis 那里的 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2017-07-23
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多