for file in *.csv
do
filename=${file%.csv}
sed -i -e "1s/\$/,filename/; 2,\$s/\$/,$filename/" "$file"
done
*csv
файл в текущем каталоге, .csv
-i
в месте -, с помощью :$
), текстом ,filename
. $
), найдите и замените конец строки($
)запятой и подготовленным именем файла Попробуйте это,
sed -e '1,/sup/d;/^[0-9]/,$d' file.txt | awk 'NF>=3{ a[$2]++ } END { for (n in a) print n, a[n] }'
1,/sup/d
удалит все доsup
/^[0-9]/,$d
удалит, если какой-либо процесс отстает отsup
Очень похоже на @msp9011
$ sed -n '/sup/,$p' input.txt|awk 'NR>1 {counts[$2]++} END { for(key in counts) print key, counts[key] }'
sed
печатает все строки, начиная с первой строки, содержащей sup
, до конца файла. awk
подсчитывает из переданной ему второй строки все разные значения во втором столбце. В конце распечатывает результат.
РЕДАКТИРОВАТЬ :Как упоминалось в @msp9011, это предполагает, что после него больше нет процессов. Чтобы найти этот процесс где-то между, вот обновленная версия:
$ sed -n '/sup$/,/^[0-9]/p' count.txt|sed -e '1d' -e '$d'|awk '{counts[$2]++} END { for(key in counts) print key, counts[key] }'
sed
печатает все, начиная со строки, которая заканчивается на sup
, до строки, начинающейся с цифры. Затем первая и последняя строки удаляются, и awk
начинает отсчет.
EDIT2 :@msp9011 уже обновил свой ответ:)
Вы можете установить «переключатель обработки» при первом совпадении записи sup
и считать, только если переключатель установлен:
$ gawk '
/sup/ {p=1}
p {a[$2]++}
END {
PROCINFO["sorted_in"] = "@ind_str_asc";
for (i in a) print i, a[i]
}' file
abc 2
cur 1
sup 3
zz0 1
zzz 1
Если ваш Awk не поддерживает PROCINFO
функцию обхода массива, вы можете направить вывод через внешнийsort