Построить таблицу - добавить столбец в зависимости от имен файлов

Состояния документации удара:

backward-kill-word (M-Rubout)

Уничтожьте слово позади точки. Границы Word совпадают с используемыми обратным словом.

И

backward-word (M-b)

Попятитесь к запуску текущего или предыдущего слова. Слова состоят из алфавитно-цифровых символов (буквы и цифры).

Обработка backward-word в Bash 4.2 сделан в связанном коде libreadline (text.c:rl_backward_word). Разрыв слова на основе rl_alphabetic, который самостоятельно полагается isalnum функция. Это зависимо от локали, но не настраивается непосредственно в ударе.

Обратите внимание, что Bash 4.0 представил другой тип "слова" с shell-forward-word и shell-backward-word действия (и уничтожают эквиваленты). Они повреждаются только на метасимволах оболочки (()<>;&|") и пробелы (возможно иждивенец локали через isblank), обработанный в основном коде удара (bashline.c).

5
22.05.2016, 23:52
4 ответа

Наиболее вероятный ответ заключается в том, что столбцы вашего файла данных разделены не табуляцией, а, например, пробелом. Вы можете проверить это, запустив одну из их через cat -vet , которая показывает настоящие вкладки как ^ I .

Чтобы изменить команду cut на использование пробела в качестве разделителя, вам нужно добавить аргумент -d '' , но поскольку вы уже заключены в одинарные кавычки и скрипт awk вам необходимо изменить свой sprintf (...) на

sprintf("<(cut -d\" \"  -f4 %s)",$0)
2
27.01.2020, 20:37

Для не слишком больших файлов:

while read -r f_part
do
    awk '
        BEGIN{
            SUBSEP=" "
        }
        NR==1{
            for(i=2;i<ARGC;i++)
                $(NF+1)=$NF
            print
        }
        FNR==1{
             next
        }
        {
             RES[$1,$2,$3]=RES[$1,$2,$3] $4 " "
        }
        END{
             for(i in RES)
                 print i, RES[i]
        }' *_${f_part}_* > big_table_${f_part}
done < <(printf '%s\n' *_*_*_*txt | cut -d_ -f3 | sort -u)

Или, если вы уверены в правильном порядке в файлах:

while read -r f_part
do 
    set -- *_${f_part}_*
    sed -i 's/\s+/:/3;s/\s\+/\t/g;s/\s*$//' "$@"
    while [ $# -gt 1 ]
    do
        join -t: $1 $2 > tmp
        mv tmp big_table_${f_part}
        shift 2
        set -- big_table_${f_part} "$@"
    done
    sed 's/:/\t/g' big_table_${f_part}
done < <(printf '%s\n' *_*_*_*txt | cut -d_ -f3 | sort -u)
2
27.01.2020, 20:37
for f in rcp8p5 rcp4p5
do  : >"$f.txt"
    find . ! -name . -prune ! -type d -name "*_${f}_*txt" -exec \
        sh -c '
            printf "%s\t" YEAR MONTH DAY
            printf "%.0sRES\t" "$@"; echo
            sed -n "
                /^[0-9]/!d;p;:n
                n
                /^[0-9]/s/.*[[:blank:]]//p
                bn
            "  "$@" | paste
    ' --    {} + >>"$f.txt"
done

... Я думаю, что я возможно, неправильно понимал, что вы делаете раньше, и, возможно, это компенсирует это. Я не уверен, что это сработает, но если это так, то это должно быть намного быстрее, чем то, что вы делаете.

Обычно find захватывает список файлов с именами, соответствующими либо ... 8 ... или ... 4 ... и руками их от {} + в оболочку.

Оболочка печатает строку заголовка, начинающуюся с YEAR MONTH DAY , за каждой следует \ t ab, а после выводит столько столбцов RES , сколько имеет аргументов. .

Затем sed объединяет все аргументы файла в один поток и печатает первую строку, начинающуюся с цифры полностью, и все эти строки, начинающиеся с цифры, которая идет после, получают только последнюю поле напечатано.

Весь вывод sed передается в paste , который заменяет все \ n ewlines во входных данных на \ t абс на выходе.

Надеюсь, эта версия будет работать, потому что вызов новой подоболочки и открытие нового канала для каждого файла в вашем списке - ужасная идея.

Если это так, этот будет , однако сделает новую строку в вашей таблице для каждой группы файлов ARGMAX - что может быть неплохо, но с этим легко справиться. потом.

2
27.01.2020, 20:37

Вы также можете сделать что-то вроде

arr=( *_rcp8p5_*.txt )
paste "${arr[@]}" | cut -f-4,$(seq -s, 8 4 $((4*${#arr[@]}))) >out_rcp8p5.txt

Это вставит все *_rcp8p5_*.txt файлы, затем извлечет поля 1-4 и каждое четвертое поле после.

1
27.01.2020, 20:37

Теги

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