Объединение данных из нескольких файлов с разделителями в один с переменными столбцами

Если Вы используете GNU du you, может использовать -S или --separate-dirs опция не включать размер подкаталогов при вычислении использования для родителя.

Ваш du команда не может поддерживать эту опцию.

Можно использовать эту пару с видом для получения самых больших отдельных каталогов (принимающий инструменты GNU):

du --separate-dirs -h . |sort -h
4
23.10.2015, 07:43
4 ответа
  cat $(ls -1 Apex_*_Latest.csv | sort -nr -k2 -t'_') | awk -F"," '{
           if (NR==1){
                nfm=NF};
           for (i=1;i<=nfm;i++) {
                printf $i","};
           print ""}' >Apex.csv

Вы можете поменять местами sort имена файлов на основе второго поля (30,20,10 ..) и cat файлов, чтобы строки с наибольшим числом столбцов идет первым.

Затем с помощью awk вы можете получить максимальное количество столбцов NF из первой строки NR if (NR == 1) {nfm = NF}

Затем запустите цикл for до тех пор, пока i (номер столбца) не будет больше или равно nfm , чтобы напечатать значения в поле № i , за которым следует от ','. если нет значения для i -го поля (бывает, когда столбцы меньше, чем последние файлы), будет напечатано только , .

0
27.01.2020, 21:00

Я думаю, что предыдущий ответ является лучшим, я просто показываю другой подход, поскольку я не использовал awk годами, с тех пор как perl и python стали популярными. Я думаю, что с awk все в порядке, просто смесь shell, sed, python и / или perl лучше подходит для моей работы.

Однако в этом случае, я думаю, любой может видеть, что решение awk более сжато и легче читается. Если подумать, я думаю, что слышал, как awk называют электронной таблицей командной строки или что-то в этом роде. : -)

Основываясь на исходном посте, я решил позволить команде ls сортировать имена файлов по времени модификации файлов, а не полагаться на формат имени файла. Шесть из одного, полдюжины из другого.

Для сравнения, вот эффективная, портативная, модульная (?!) версия решения на чистой оболочке:

    #!/bin/sh

    get_commas() {
        sed 's/[^,]//g; 1q' "$@"
    }

    get_extra_commas() {
        local maxcommas="$1"
        local file="$2"
        local new_commas=$(get_commas "$file")
        local extra_commas=""
        while [ "${new_commas}${extra_commas}" != "${maxcommas}" ]
        do
            extra_commas=",$extra_commas"
        done
        echo "$extra_commas"
    }

    unset header
    ls -t Apex*.csv |
    while read filename
    do
        if [ -z "$header" ]
        then
            header="$(sed 1q "$filename")"
            commas=$(echo "$header" | get_commas)
            echo "$header"
        fi
        extra_commas=$(get_extra_commas $commas "$filename")
        sed "1d; s/\$/$extra_commas/" "$filename"
    done
0
27.01.2020, 21:00

Вот ответ, реализованный в Miller :

$ cat rect.mlr
for (k,v in $*) {
  @fields[k] = v; # retain already-seen field names
}
for (k,v in @fields) {
  if (isabsent($[k])) {
    $[k] = "";
  }
}

$ mlr --csvlite put -f rect.mlr Apex_30_Latest.csv Apex_20_Latest.csv Apex_10_Latest.csv
A,B,C,D
1,2,3,4
2,3,4,5
3,4,5,6
4,5,6,
5,6,7,
6,7,8,
7,8,,
8,9,,
9,10,,

Поскольку Миллер внутренне обрабатывает именованные столбцы, управление строками заголовков становится проще.

0
27.01.2020, 21:00


с Миллером(http://johnkerl.org/miller/doc/)как обычно очень легко

mlr --csv unsparsify Apex_*_Latest.csv

дает вам

A,B,C,D
1,2,3,4
2,3,4,5
3,4,5,6
4,5,6,
5,6,7,
6,7,8,
7,8,,
8,9,,
9,10,,
2
27.01.2020, 21:00

Теги

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