Я сделал по методу ниже
sed -e "s/H//g" -e "s/\s.*//g" filename | perl -pne "s/\n/,/g"| sed "s/,$//g"
выход
1,337,1106,1129,1370
\s
— это сокращенный способ регулярного выражения GNU для записи выражения POSIX [[:blank:]]
, который соответствует пробелу или символу табуляции(\s
также соответствует новой строке, если они были вставлены в пространство шаблона sed
с помощью других команды редактирования ). Нотация \s
первоначально пришла из регулярных выражений Perl, но в регулярном выражении Perl она работает так же, как [[:space:]]
в выражении POSIX, сопоставляя более широкий массив пробелов -, производящих символы.
Команда
sed 's/\s\s*/ /g'
заменяет один или несколько последовательных пробелов/табуляций одним пробелом, а затем повторяет замену до тех пор, пока в текущей строке больше не будет совпадений.
Итак, да, вы могли бы использовать s/\s+/g
вместо этого, но это расширенное(GNU )регулярное выражение, а не базовое, поэтому вам нужно было бы добавить -E
к команда:
sed -E 's/\s+/ /g'
Теперь используется не -стандартная опция(-E
)и специальные GNU -регулярные выражения(\s
). Чтобы написать команду стандартным образом, вам нужно будет использовать
sed 's/[[:blank:]][[:blank:]]*/ /g'
или
sed 's/[[:blank:]]\{1,\}/ /g'
где \{1,\}
означает то же, что и расширенные модификаторы регулярных выражений +
и{1,}
(«один или несколько» ).
Вы также можете просто использовать
tr -s '[:blank:]' ' '
что сделало бы то же самое, т. е. преобразовало бы все пробелы и табуляции в пробелы и сжало бы(-s
)ряды последовательных пробелов в одиночные пробелы.
Или вы можете заставить sed
выполнять работу tail
в этом конвейере и использовать
ls -l dir | sed '1d; s/[[:blank:]]\{1,\}/ /g' | cut -d ' ' -f 3 | sort | uniq -c
Или просто используйтеawk
:
ls -l dir | awk 'NR > 1 { count[$3]++ } END { for (user in count) print user, count[user] }'
(С awk
,вам не нужно беспокоиться о сжатии пробелов)