Вы не можете ограничить пользователя root.
Для всех остальных с этим справятся стандартные разрешения. Возможность удаления файла или каталога зависит от доступа на запись к родительскому каталогу.
С GNU awk для сортировки _в:
$ cat tst.awk
BEGIN {
FS=OFS=","
}
{
sub(/\r$/,"")
print sort($0)
}
function sort(inStr, arr,idx,sep,outStr) {
PROCINFO["sorted_in"] = "@val_str_asc"
split(inStr,arr)
for (idx in arr) {
outStr = outStr sep arr[idx]
sep = OFS
}
return outStr
}
$ awk -f tst.awk file
a,b,c
d,e,k
или с любым awk, но будет выполняться намного медленнее, так как порождает оболочку для вызова UNIX sort
для каждой строки ввода:
$ cat tst.awk
BEGIN {
FS=OFS=","
}
{
sub(/\r$/,"")
print sort($0)
}
function sort(inStr, cmd,line,sep,outStr) {
gsub(/,/,"\n",inStr)
cmd = "printf \047%s\n\047 \047" inStr "\047 | sort"
while ( (cmd | getline line) > 0 ) {
outStr = outStr sep line
sep = OFS
}
close(cmd)
return outStr
}
$ awk -f tst.awk file
a,b,c
d,e,k
Ошибка sub(/\r$/,"")
возникает из-за того, что у вас есть окончания строк DOS в опубликованном образце входных данных, но нет в опубликованном ожидаемом выводе.
Если у вас все в порядке сperl
:
$ perl -F, -lane 'print join ",", sort @F' ip.txt
a,b,c
d,e,k
-F,
указывает, что строка ввода должна быть разделена с помощью ,
в качестве разделителя, а результат доступен через массив @F
sort @F
будет сортировать в алфавитном порядке, и результирующий массив будет объединен join
с использованием ,
в качестве разделителя
СGNU awk
$ awk 'BEGIN{PROCINFO["sorted_in"] = "@val_str_asc"}
{s = ""; c=0; split($0,a,",");
for(k in a) s = c++ ? s "," a[k] : a[k];
print s}' ip.txt
a,b,c
d,e,k
См. руководство gawk :Использование предопределенных порядков сканирования массивов для получения подробной информации об упорядочении массивов, использованном выше
perl -nlE 'say join ",", sort split ","' file.txt
Пояснение:
for each line like "r,d,a":
"r,d,a"
↓ split "," it
("r","d","a")
↓ sort it
("a","d","r")
↓ join "," it
"a,d,r"
say it