Группировка с множественным значением, соответствующим одному клавишу в файле CSV, используя awk

Чистое bash решение, использующее только практически универсально доступные системные команды:

timeout() {
    if (( $# < 3 )); then
        printf '%s\n' 'Usage: timeout sigterm-seconds sigkill-seconds command [arg ...]'
        return 1
    fi

    "${@:3}" &
    pid=$!

    sleep "$1"

    if ps "${pid}" >/dev/null 2>&1; then
        kill -TERM "${pid}"
        sleep "$2"
        if ! ps "${pid}" >/dev/null 2>&1; then
            printf '%s\n' "Process timed out, and was terminated by SIGTERM."
            return 2
        else
            kill -KILL "${pid}"
            sleep 1
            if ! ps "${pid}" >/dev/null 2>&1; then
                printf '%s\n' "Process timed out, and was terminated by SIGKILL."
                return 3
            else
                printf '%s\n' "Process timed out, but can't be terminated (SIGKILL ineffective)."
                return 4
            fi
        fi
    else
        printf '%s\n' "Process exited gracefully before timeout."
    fi
}

Затем запустите как timeout sigterm-seconds sigkill-seconds команду [arg ...].

1
03.10.2018, 23:52
4 ответа

Допустим, ваш CSV-файл называется «list.csv». Я бы сделал так:

#!/bin/bash
echo -e "Keyobject","Are you sleeping ", " Country of meeting"   # create new header
cat list.csv | sed 1,1d | awk -F, 'NF>1{print $NF}' | paste -d', ' - - | sed 's/ /,/' | nl


 1  yes,USA 
 2  ' ', ' '
 3  yes,CHINA
 4  yes,ITALY

Пояснение:

sed 1,1d # This command excludes the original header in list.csv
awk -F, 'NF>1{print $NF}' # This command reads the last word in each row
paste -d', ' - -  # This command paste the words beside each other 
sed 's/ /,/'  # This command replaces blank spaces with commas
nl # This command adds numbering to the rows in the final output

Однако это решение предполагает, что строки в исходном CSV-файле организованы так, как показано в приведенном выше примере.

0
27.01.2020, 23:42
awk <file -v IV="' '" -v OV=" " -F, '
        $1+0 {
                b = $2 == IV ? OV : $2
                a[$1,$2] = $3 == IV ? OV : $3
                if($1 > max) max = $1; t[$2]++;
        }
        END{
                ORS = ""
                print "Keyobject"
                for(k in t) print FS k
                print RS
                for(i = 1; i <= max; i++){
                        print i
                        for(k in t)
                                print FS (i SUBSEP k in a ? a[i,k] : OV)
                        print RS
                }
        }
'

Настройте переменные IVи OVдля того, какое пустое поле должно быть на входе и выходе соответственно.

0
27.01.2020, 23:42

Попробуйте также

awk -F, -v OFS="," '
NR == 1                 {HD      = "Keyobject,are you sleeping,country of meeting"
                         for (MX=n=split (HD, HDArr, OFS); n>0; n--) SRCH[HDArr[n]]
                         print HD
                         next
                        }


$2 in SRCH              {RES[$2] = $3
                         RES[HDArr[1]] = $1
                        }

NR%2                    {for (i=1; i<=MX; i++) printf "%s%s", RES[HDArr[i]], (i == MX)?ORS:OFS
                         split ("", RES)
                        }

' file
Keyobject,are you sleeping,country of meeting
1,yes,USA 
2,' ',' '
3,yes,CHINA
4,yes,ITALY

При чтении строки 1 создается заголовок и массив поиска, индексированный элементами заголовка, и печатается заголовок. В следующих строках массиву результатов, индексированному по $2, присваивается значение $3, причем избыточно для строки индекса «Keyobject». Для каждой второй строки выводится результат, а массив результатов удаляется.

0
27.01.2020, 23:42
awk -F, '
    NR > 1 {ids[$1]; keys[$2]; value[$1,$2] = $3}
    END { 
        printf "Keyobject"
        for (k in keys)
            printf ",%s", k
        print ""

        for (id in ids) {
            printf id
            for (k in keys)
                printf ",%s", value[id,k]
            print ""
        }
    }
' file
1
27.01.2020, 23:42

Теги

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