BashはCSVファイルのすべての列を読み取り、各行に空のセルを表示します。

BashはCSVファイルのすべての列を読み取り、各行に空のセルを表示します。

例CSV

各列を見て、空白を確認し、それらを1つの列にグループ化するスクリプトが必要です。たとえば、最初の行は次のようになります。バナナ、2行目:レイチェル、5行目:レイチェル、モニカ、チャンドラー、ジョイ、ジェニス、バナナ

答え1

これがあなたにどのように役立つかを確認してください

awk -F\; '
    {TMP = ""
     for (i=1; i<=NF; i++) if ($i == "") TMP = sprintf ("%s,%c", TMP, 64+i)
     print substr (TMP,2)
    }
' /test1.csv
B,F,H
A,G,H

A,C,F

必要に応じてフィールド区切り記号を調整します。 26列目以降は失敗します。

新しい要件に適応

    awk -F\; '
    NR == 1 {MX = split ($0, HDR)
             next
            }
            {TMP = ""
             for (i=1; i<=MX; i++) if ($i == "") TMP = sprintf ("%s,%s", TMP, HDR[i])
             print substr (TMP,2)
            }
    ' file
banana
rachel
banana
rachel,monica,chandler,joey,janice,banana
rachel,monica,chandler,joey,banana

答え2

私はあなたが次のようなものを探していると思います

awk '
BEGIN { FS=";" }
NR==1 {
        for(i = 1; i <= NF; i++) { heads[i]=$i; }
      }

      { for(i = 1; i <= NF; i++) {
          if ($i == "") { printf "%s ",heads[i] }
        }
        print "";
      } 
'

これにより、最初の行のフィールドが配列に分割されますheads。最初の行ではなく各行に対して、awkは列を繰り返して列名を印刷します(フィールドが空の場合)。しかし、テストする時間はありません。エラーがある可能性があります。青少年MMV

答え3

また、以下を試してください。

BEGIN {FS=OFS=","}
{
    if (NR == 1)
        split($0, hdr)

        if (nr) {nr = 0; print("")}
        for(f=1; f<=NF; f++)
            if ($f == "") {
                if (!nr)
                    printf("%s", hdr[f])
                else
                    printf("%c%s", OFS, hdr[f])
                nr = 1
            }
}

まあ、特別なBANANA列の実装は次のとおりです。

BEGIN {FS = OFS = ","}

NR == 1 {
        printf("%s%c%s\n", $0, OFS, "BANANA")
        split($0, hdr)
        next
}

{
        for(f = 1; f <= NF; f++)
            if ($f == "") {
                printf("%s%c%s\n", $0, OFS, hdr[f])
                break
            }
}

関連情報