Вы можете сделать это, используя bash
и массивы, как показано:
#!/bin/bash
# store the numerically sorted file1 into array A
A=( $(sort -t/ -k1,1n -k2,2n < file-1) )
# determine the maximum field width by examining the lengths of the 2nd field
# and the string "VLAN-NAME" coming for the header.
maxW=$(
{ echo ',"VLAN-NAME"'; cat < file-2; } |
cut -d, -f2 | awk '{print length-2}' |
sort -nr | sed q
)
# first two fields of the header
B=( "VLAN-ID " "$(printf " %-${maxW}s\n" "VLAN-NAME")" )
# complete header: from array B and the numerically sorted file1 contents
C=( "${B[@]}" "$(IFS="|"; echo "${A[*]}")" )
# display the header
echo "$(IFS="|"; echo "${B[*]}")" |\
sed -e 's/[^[:blank:]]/ /g;s/$/| interface switch/'
echo "$(IFS="|"; echo "${C[*]}")"
# remaining lines printed
while IFS=, read -ra B; do
D=(x)
for arg in "${A[@]}"; do
case " ${B[*]:2} " in *" $arg "* ) res=* ;; * ) res=\ ;; esac
var1=${arg//[!\/]/ } D=( "${D[@]}" "${var1/\//$res}" )
done
printf "%8s| %${maxW}s|%s\n" "${B[0]}" "${B[1]//\"/}" "$(IFS="|";echo "${D[*]:1}")"
done < file-2
| interface switch
VLAN-ID | VLAN-NAME |1/1|1/2|1/3|1/4|1/5|1/6|1/7|1/8|1/9|1/10|3/3
1| vlan-wifi| * | | | | | | * | * | | |
2| vlan-admin| | | * | | * | * | | | | |
3| | | | * | | | | | | | | *
Некоторые предложения здесь . Я бы создал список чисел, а затем подставил бы оставшуюся часть строки вокруг них. Я считаю эту стратегию проще, так как вам нужно по два каждого числа. Например, в пустом документе:
:put =range(34,160)
:%s,\(.*\),<a class='gallery' href="galimages/boards/board\1.jpg" alt="board large"><image src ="galimages/boards/thumbs/\1.jpg" alt="board thumb"></a>
N.B. put
создает пустую строку в первой строке, поэтому вам придется удалить ее вручную.
: put = range (34,160)
: Создайте диапазон чисел от 34 до 160, по одному в каждой строке. Как уже отмечалось, это фактически начинает документ с пустой строки, поэтому удалите его вручную сейчас или позже. :% s, FOO, BAR
: по всему документу (%
) выполните поиск и замените ( s
), заменив FOO
с BAR
. FOO
: \ (. * \)
. Замените всю строку (. *
), но сохраните содержимое (номер) в группе захвата, то есть \ (... \)
. BAR
: при необходимости замените строкой, используя число в двух местах ( \ 1
), чтобы создать заключительные строки. Вы можете использовать аналогичную стратегию в оболочке без использования vim
.
$ seq 34 160 | sed 's,\(.*\),<a class='\''gallery'\'' href="galimages/boards/board\1.jpg" alt="board large"><image src ="galimages/boards/thumbs/\1.jpg" alt="board thumb"></a>,'
seq 34 160
: Создайте диапазон чисел от 34 до 160, по одному в каждой строке. sed…
: заменить, как указано выше. N.B.поскольку я цитирую аргумент sed
с помощью '
, этот сценарий экранирует встроенные '
с помощью '\' '
.