Bash Чтобы прочитать все столбцы и отображать пустые ячейки в каждой строке из файла CSV

Попробуйте вместо этого:

#!/bin/sh
## Name of the program is challengelab3.2

## request information from the user
echo enter 3 numbers
read a b c

[ -z "$a" ] && echo a is missing, enter all 3 numbers && exit 1
[ -z "$b" ] && echo b is missing, enter all 3 numbers && exit 1
[ -z "$c" ] && echo c is missing, enter all 3 numbers && exit 1

if [ "$a" -gt 10 -o "$b" -gt 10 -o "$c" -gt 5 ]; then
    echo "numbers out of range"
    exit 1
fi

# process_data
x=$((a + b + c))

while [ "$x" -gt 0 ]
do
    echo $(( x / 2 % 2 ))
    x=$((x - 1))
done
  1. арифметика оболочки выполняется с помощью $ ((...))

  2. Не забудьте указать переменные вне $ (()) и [[]] . Без кавычек, если $ a, $ b или $ c не определены (например, пользователь вводит только 1 или 2 числа), будет синтаксическая ошибка, потому что -gt требует двух операндов.

-1
07.08.2018, 13:46
3 ответа

Посмотрите, как далеко это вас заведет

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
1
28.01.2020, 05:10

Попробуйте и это:

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
            }
}
0
28.01.2020, 05:10

Думаю, вы ищете что-то вроде

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 перебирает столбцы и печатает имя столбца, если поле пусто. Хотя не было времени протестировать. Может содержать ошибки. YMMV

0
28.01.2020, 05:10

Теги

Похожие вопросы