Для любого фиксированного упорядочивания вызовов (a, b, c, d в вашем примере) вы можете использовать, например, программу awk
, подобную этой, чтобы выполнить задача:
awk -v order=',a,b,c,d' '
BEGIN {
OFS = FS = "\t"
n = split(order,ord,",")
for (i=1; i<=n; i++) ind[ord[i]] = i
}
FNR==1 {
for (i=2; i<=n; i++) prm[ind[$i]] = i
}
{
out[$1] = sprintf("%s", $1)
for (i=2; i<=n; i++) {
out[$1] = out[$1] sprintf("%s%s", OFS, $prm[i])
}
out[$1] = out[$1] sprintf("%s%s", OFS, $NF)
}
ENDFILE {
for (i=1; i<=n; i++) print out[ord[i]]
print out[$1] ORS
}
' a.csv b.csv c.csv
Примечание. Этот код предполагает наличие последней версии (4.x) GNU awk из-за условия ENDFILE
. (Если это недоступно, решение требует корректировки.)
Примечание 2: Если вы хотите обрабатывать файлы индивидуально (один файл данных на вызов awk
), вы можете заменить ENDFILE
] от END
(который также будет работать в более старых awk
s).
Результаты для ваших образцов данных:
a b c d x
a 1 2 5 3 3
b 2 2 5 5 2
c 5 5 6 6 5
d 2 3 4 4 6
x 3 1 7 6 9
a b c d y
a 6 4 4 6 2
b 3 2 4 6 4
c 6 6 2 5 5
d 5 6 3 2 3
y 7 6 3 5 9
a b c d z
a 3 5 3 5 2
b 3 6 2 6 7
c 5 6 4 6 1
d 7 7 4 5 2
z 5 4 3 6 7
ls -tr /tmp/cores
не перечисляет полные пути к файлам, а только их базовые имена.
Вместо этого попробуйте ls -tr /tmp/cores/* |...
.
Но вам все это не нужно --, так как все имена файлов имеют видcore.%t
(%t
= unix time of dump ),вы можете просто положиться на glob для их сортировки. Кроме того, не имеет смысла удалять 10 файлов после того, как вы добавите всего один --после нескольких шагов, вы останетесь без файлов в каталоге.
#! /bin/sh
cat > "$1"
# remove the oldest file if there are more than 100
cleanup(){ test "$#" -gt 100 && rm "$1" }
cleanup /tmp/cores/*