Как было указано в комментарии и ответе, проблема заключается в расширении вашего псевдонима.
Но для этого есть решения:
Если вы хотите, чтобы sudo
работал со всеми вашими псевдонимами (и таким образом обходил проблему, указанную @Kusalananda ), вы можете добавить следующий псевдоним в свой файл псевдонимов:
alias sudo='sudo '
Если бы вы сделали это, sudo rm
было бы расширено до sudo trash-put
, как вы и ожидали.
Чтобы ответить на комментарий @Dubu о том, что псевдонимы работают только как первое слово команды :, если вы добавите флаг -g
в определение псевдонима, он станет глобальным и будет работать, даже если не находится в командной позиции.. Вы могли бы сделать это с вашим псевдонимом rm
. Однако вы, вероятно, не хотите иметь другие неприятные сюрпризы с sudo
, поэтому первый метод здесь более уместен. Это более актуально, если вы хотите, например, установить псевдоним для передаваемой по каналу команды (, например.alias -g pl='| less'
).
Что касается расположения корзины при использовании trash-cli
с sudo
, на это отвечает @Arthur2e5. Я просто могу добавить, что в моем случае это:
/home/.Trash-0
Этот сценарий предполагает, что вы предоставите входные и выходные файлы при его запуске.
#! /bin/bash
INFILE=$1
OUTFILE=$2
echo "<html><head><title>output from csv</title></head><body><table>" > $OUTFILE
while IFS= read -r line
do
sed -r 's|\s*([0-9]+)\s+(.+)|<tr><td>\1</td><td>\2</td></tr>|' >> $OUTFILE
done < <(cat $INFILE | cut -d, -f 4 | sort | uniq -c | sort -nr)
echo "</table></body></html>" >> $OUTFILE
По сути, вы просто создаете очень простой шаблон HTML и перебираете входные данные. Я использовал sed
для разбора и преобразования входных данных, но это можно сделать множеством способов.
usage: bash./script.sh infile outfile
Вы пытаетесь обработать файл CSV (с кавычками и запятыми внутри полей ), как если бы это был простой файл с разделителями -запятыми. Это не сработает. Вам нужно использовать парсер CSV, который понимает поля в кавычках.
Например, для подсчета четвертого столбца с использованием perl
и его модуля Text ::CSV с выходным форматом, подобным форматуuniq -c
:
#!/usr/bin/perl
use strict;
use Text::CSV;
my $file = shift; # use first arg as the input filename
my %column;
my $csv = Text::CSV->new({ binary => 1});
open(my $fh, '<', $file) or die "couldn't open $file: $!";
while (my $row = $csv->getline($fh)) {
# perl arrays start from zero, so row[3] is the fourth field.
$column{$$row[3]}++;
}
close $fh;
# reverse sort the %column hash by value
foreach my $key (sort { $column{$b} <=> $column{$a} } keys %column) {
printf "%7i\t%s\n", $column{$key}, $key;
};
Если входной файл содержит какие-либо символы utf -8, измените '<'
в операторе open()
в строке 10 на'<:encoding(utf8)'
Выход:
$./count.pl file.csv
6 Restaurants, bars i hotels (Inclos hostals, pensions i fondes)
1 Equipament personal
1 Finances i assegurances
1 Parament de la llar
Приведенный ниже сценарий использует тот же модуль Text ::CSV для создания минимальной HTML-таблицы, которая выводится на стандартный вывод.
Этот скрипт также использует HTML ::Entities из коллекции модулей HTML ::Parser , чтобы гарантировать, что ничто во входных столбцах не нарушит HTML (, например. Символы <
и >
должны быть закодированы как <
и >
, чтобы предотвратить их интерпретацию браузером)
#!/usr/bin/perl
use strict;
use Text::CSV;
use HTML::Entities;
my $file = shift; # use first arg as the input filename
print "<html>\n<body>\n";
print "<table>\n";
my $csv = Text::CSV->new({ binary => 1});
open(my $fh, '<', $file) or die "couldn't open $file: $!";
while (my $row = $csv->getline($fh)) {
print '<tr>';
foreach my $i (@{ $row }) {
print "<td>". encode_entities($i). "</td>"
};
print "</tr>\n";
}
close $fh;
print "</table>\n";
print "</body>\n</html>\n";
Выход:
$./table.pl file.csv
<html>
<body>
<table>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>Restaurants</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>11</td><td>Finances i assegurances</td><td>Finances i assegurances</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>serveis d'allotjament</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>Bars / CIBERCAFE</td><td>1</td></tr>
<tr><td>1</td><td>Comerç al detall</td><td>4</td><td>Equipament personal</td><td>Calçat i pell</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>Bars / CIBERCAFE</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>Bars / CIBERCAFE</td><td>1</td></tr>
<tr><td>1</td><td>Comerç al detall</td><td>3</td><td>Parament de la llar</td><td>Mobles i articles fusta i metall</td><td>1</td></tr>
<tr><td>2</td><td>Serveis</td><td>14</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td><td>Restaurants</td><td>1</td></tr>
</table>
</body>
</html>
Это может быть легко адаптировано для создания таблицы конвейера уценки или таблицы TeX, или любой другой требуемой таблицы.
Примечание :Все упомянутые библиотечные модули доступны для большинства дистрибутивов Linux. Например, в Debian и родственных дистрибутивах их можно установить с помощью sudo apt install libtext-csv-perl libhtml-parser-perl
. В противном случае их можно установить с помощью cpan
.
Вот как получить не -HTML-вывод. Я думаю, вы действительно хотите использовать любой POSIX awk:
$ cat tst.awk
{
gsub(/^([^,]*,){3}"?|"?(,[^,]*){2}$/,"")
cnts[$0]++
}
END {
for (type in cnts) {
print cnts[type], type
}
}
$ awk -f tst.awk file
6 Restaurants, bars i hotels (Inclos hostals, pensions i fondes)
1 Finances i assegurances
1 Parament de la llar
1 Equipament personal
Передайте это в sort
или используйте GNU awk для sorted_in
, если вам небезразличен порядок. Чтобы получить вывод в виде таблицы HTML, будет:
$ cat tst.awk
{
gsub(/^([^,]*,){3}"?|"?(,[^,]*){2}$/,"")
cnts[$0]++
}
END {
print "<html>\n<table>"
PROCINFO["sorted_in"] = "@val_num_desc"
for (type in cnts) {
printf "<tr><td>%s</td><td>%s</td></tr>\n", cnts[type], type
}
print "</table>\n</html>"
}
$ awk -f tst.awk file
<html>
<table>
<tr><td>6</td><td>Restaurants, bars i hotels (Inclos hostals, pensions i fondes)</td></tr>
<tr><td>1</td><td>Finances i assegurances</td></tr>
<tr><td>1</td><td>Parament de la llar</td></tr>
<tr><td>1</td><td>Equipament personal</td></tr>
</table>
</html>
и в этом случае вы все еще можете сортировать с помощью sort
, изолируя перед сортировкой первые и последние 2 строки, но использовать GNU awk для sorted_in
проще, поэтому на этот раз я включил это в сценарий.
Если вас беспокоят нежелательные символы (&
, <
или >
), появляющиеся во входных данных и нарушающие вывод HTML, просто добавьте это прямо над строкой cnts[$0]++
:
gsub(/&/,"\\&"); gsub(/</,"\\<"); gsub(/>/,"\\>")