3

我有一个 csv 文件,它当然是用逗号分隔的,并且想要删除所有具有特定标题的列,例如:

voltage, current, power, voltage, current, power
      2,       3,     6,      12,      12,   144  
      3,       5,    15,      10,      10,   100  

应该

voltage, power, voltage, power  
      2,     6,      12,   144  
      3,    15,      10,   100  
4

4 回答 4

2

内容script.awk

BEGIN {
    FS=" , "
}

NR==1 {
    for (i=1; i<=NF; i++) {
        if ($i == "current") {
            array[i]++
        }
        else {
            printf (i != NF) ? $i", " : $i
        }
    }
}

NR>=2 {
    for (j=1; j<=NF; j++) {
        if (!(j in array)) {
            printf (j != NF) ? $j", " : $j
        }
    }
}

{
    printf "\n"
}

内容file.txt

voltage , current , power , voltage , current , power
2 , 3 , 6 , 12 , 12 , 144
3 , 5 , 15 , 10 , 10 , 100

像这样运行:

awk -f script.awk file.txt

结果:

voltage, power, voltage, power
2, 6, 12, 144
3, 15, 10, 100
于 2012-09-13T10:29:55.333 回答
1

如果要删除所有标题为“当前”的列:

kent$  awk -F',' 'NR==1{for(x=1;x<=NF;x++)if($x!="current")l[x]++;}{for(i=1;i<=NF;i++)if(i in l)printf (i==NF)?$i"":$i", ";printf "\n"}' test.txt 

voltage, power, voltage, power
2, 6, 12, 144
3, 15, 10, 100

注意:我删除了上面 test.txt 中的空格。

  • 如果您有不同的标题需要删除。您可以尝试使用正则表达式,并替换$x!="foo"为正则表达式匹配。

  • 如果您知道删除列的规则,例如 2nd column, 5th, 8th ...(+3) 它可能更容易处理,例如通过循环。

于 2012-09-13T10:16:04.237 回答
0

假设输入文件名为 input.txt

awk  -F ',' '{print $1 "," $3 "," $5 "," $6 }' input.txt
于 2012-09-13T09:22:27.073 回答
0

请注意,对于一般的 CSV 文件处理,应使用适当的库。如果数据非常简单,即没有嵌入的逗号、换行符等,则可以使用更简单的工具。

awk史蒂夫那里得到了一个很好的解决方案,所以我将添加一个基于 coreutils 和 grep 的答案:

# find columns to remove
pattern=current
cols=$(head -n1 a.csv | tr ',' '\n' | grep -n "$pattern" | cut -d: -f1 | paste -s -d,)

# remove all columns that matched
cut --complement -d, -f$cols a.csv

输出:

voltage, power, voltage, power
2 , 6 , 12 , 144
3 , 15 , 10 , 100

请注意,该--complement选项是 GNU 剪切扩展。要$cols为其他剪辑生成,应该这样做(在 FreeBSD 上的 zsh 中测试):

# number of columns
file=a.csv
pattern=current
n=$(head -n1 "$file" | tr ',' '\n' | wc -l)

# generate complementary list
cols=$(jot $n \
| grep -xvFf <(head -n1 "$file" | tr ',' '\n' | grep -n "$pattern" | cut -d: -f1) \
| paste -s -d, -)

# remove columns
cut -d, -f$cols "$file"
于 2012-09-13T09:42:20.920 回答