【发布时间】: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