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"正規表現の一致に置き換えることができます。

  • たとえば、2 列目、5 番目、8 番目 ...(+3) などの列を削除するルールがわかっている場合は、たとえばループすることで、処理が簡単になる可能性があります。

于 2012-09-13T10:16:04.237 に答える
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 に答える
0

入力ファイル名がinput.txtであると仮定します

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