Если Вы используете GNU du you, может использовать -S
или --separate-dirs
опция не включать размер подкаталогов при вычислении использования для родителя.
Ваш du
команда не может поддерживать эту опцию.
Можно использовать эту пару с видом для получения самых больших отдельных каталогов (принимающий инструменты GNU):
du --separate-dirs -h . |sort -h
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
-го поля (бывает, когда столбцы меньше, чем последние файлы), будет напечатано только ,
.
Я думаю, что предыдущий ответ является лучшим, я просто показываю другой подход, поскольку я не использовал 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
Вот ответ, реализованный в 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,,
Поскольку Миллер внутренне обрабатывает именованные столбцы, управление строками заголовков становится проще.
с Миллером(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,,