Состояния документации удара:
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
).
Наиболее вероятный ответ заключается в том, что столбцы вашего файла данных разделены
не табуляцией, а, например, пробелом. Вы можете проверить это, запустив одну из
их через cat -vet
, которая показывает настоящие вкладки как ^ I
.
Чтобы изменить команду cut
на использование пробела в качестве разделителя, вам нужно
добавить аргумент -d ''
, но поскольку вы уже заключены в одинарные кавычки и скрипт awk
вам необходимо изменить свой sprintf (...)
на
sprintf("<(cut -d\" \" -f4 %s)",$0)
Для не слишком больших файлов:
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)
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
- что может быть неплохо, но с этим легко справиться. потом.
Вы также можете сделать что-то вроде
arr=( *_rcp8p5_*.txt )
paste "${arr[@]}" | cut -f-4,$(seq -s, 8 4 $((4*${#arr[@]}))) >out_rcp8p5.txt
Это вставит
все *_rcp8p5_*.txt
файлы, затем извлечет поля 1-4 и каждое четвертое поле после.