Aqui estão algumas opções usando awk
Primeiro, a versão KISS - usando alguns arquivos temporários a
e b
:
for f in *.txt; do
awk '/^N/ {print > "b"; next} {print > "a"}' "$f"
cat a b > "$f"
done
Só porque. . .
O que você realmente quer fazer é uma classificação no local com uma ordem de classificação personalizada (linhas iniciando com N
depois de todo o restante, depois a ordem original), por exemplo, no GNU awk
:
function mycmp(ia, a, ib, b) {
x = substr(a,1,1) == "N"
y = substr(b,1,1) == "N"
if (x && !y) return 1
else if (!x && y) return -1
else return ia - ib
}
{a[FNR] = $0}
ENDFILE {
for (i in a) print a[i]
}
As versões mais recentes de gawk
fornecem uma extensão in-loco - emprestando a implementação de referência de 16.7.4 Ativando a edição de arquivos no local
podemos juntar tudo como um script gawk, Nsort.awk
diz:
#!/usr/bin/gawk -f
@load "inplace"
function mycmp(ia, a, ib, b) {
x = substr(a,1,1) == "N"
y = substr(b,1,1) == "N"
if (x && !y) return 1
else if (!x && y) return -1
else return ia - ib
}
BEGIN {
inplace = 1
INPLACE_SUFFIX = ".bak"
PROCINFO["sorted_in"] = "mycmp"
}
BEGINFILE {
if (_inplace_filename != "")
inplace_end(_inplace_filename, INPLACE_SUFFIX)
if (inplace)
inplace_begin(_inplace_filename = FILENAME, INPLACE_SUFFIX)
else
_inplace_filename = ""
}
{a[FNR] = $0}
ENDFILE {
for (i in a) print a[i]
}
END {
if (_inplace_filename != "")
inplace_end(_inplace_filename, INPLACE_SUFFIX)
}
Torne-o executável com chmod +x Nsort.awk
e execute-o como
./Nsort.awk *.txt