Попытка сделать это с помощью awk:
count.awk:
#!/usr/bin/awk -f
# count line containing word
{
for (i = 1 ; i <= NF ; i++) {
word_in_a_line[$i] ++
if (word_in_a_line[$i] == 1) {
word_line_count[$i] ++
}
}
delete word_in_a_line
}
END {
for (word in word_line_count){
printf "%s:%d\n",word,word_line_count[word]
}
}
Запустите его:
$ awk -f count.awk./test.data | sort
Чтобы сохранить начальные пробелы при вставке переменной, вам просто нужно экранировать один раз пробелы с обратной косой чертой \
после команды вставить i
, например:
$ sed '50i\'"$add" file
public function add($hardware_id = null)
Не относится к переменным, было бы то же самое, если бы текст был вставлен буквально.
Это не указанное в POSIX поведение, которое предписывает экранированный литерал новой строки перед вставляемым текстом.
Самый простой способ добиться этого — использовать синтаксис i\
. Но поскольку мы находимся под зонтиком двойных кавычек, мы избегаем обратной косой черты. И переменная должна быть безопасной для этой операции путем экранирования новой строки (s )и обратной косой черты (s)
add=' public function add($hardware_id \= null
)'
#------------------------------
# make variable safe to use
# by escaping backslash n newline
esc_add=$(printf '%s\n' "$add" |
sed -e 's:\\:&&:g;$!s:$:\\:g')
sed -e "
5i\\
$esc_add
" file | nl
1 ABC
2 2 3 4:blockA-1
3 7 9 4:blockA-2
4 1 2 5:blockA-3/
5 public function add($hardware_id \= null
6 )
7 ABC
8 13 11 17:blockB-1
9 2 1 1:blockB-2/
10 ABC
11 7 9 14:blockC-1
12 5 8 2:BlockC-2
13 9 9 9:BlockC-3
14 7 1 2:BlockC-4$
Сделайте себе одолжение и используйте perl
или awk
вместо sed
здесь, чтобы сделать это:
add=$' anything including \\backslash\\
and newline and even non\x80-text or overlong lines '
ADD=$add perl -pe '$_ = "$ENV{ADD}\n$_" if $. == 5' < "$file"
Или (, хотя это может привести к сбою из-за слишком длинных строк или байтов NUL в содержимом, и будьте осторожны, он добавит завершающую новую строку, если ее изначально не было):
ADD=$add LC_ALL=C awk 'NR == 5 {$0 = ENVIRON["ADD"] ORS $0}; 1' < "$file"