Сценарий оболочки -Чтение строк файла CSV и добавление префикса для нескольких значений в ячейке

Эта версия rpcinfoвыглядит несколько поспешным, так как номер порта отображается в виде двух отдельных байтов вместо одного 16-битного -числа.

Предполагается, что служба portmapperвсегда находится на порту 111, поскольку она используется для поиска всех других служб RPC, номера портов которых могут различаться. (Поскольку протокол ONC RPC был разработан до того, как брандмауэры получили широкое распространение, современные реализации все чаще используют статические номера портов; например. Ожидается, что NFS будет работать через порт 2049 по умолчанию.)

На стороне IPv6 это наиболее отчетливо видно. :IPv6-адрес со всеми -нулями отображается как ::, а затем номер порта представляется как .0.111после него. В данном случае это означает, что старший байт номера порта равен 0, а младший байт — 111.

Тот же синтаксис используется на стороне IPv4 :поле адреса содержит все -нули IPv4-адреса (INADDR _ANY)0.0.0.0и двухбайтовое -представление адреса номер порта .0.111объединен вместе.

Фактический номер порта можно получить, умножив старший бит номера порта на 256, а затем прибавив к нему значение младшего бита. Так, например, номер порта 2049 будет отображаться как .8.1в этом синтаксисе(8*256 + 1= 2049)

0
07.07.2020, 07:58
4 ответа

Подход с использованием sed.

prefix1=a.
prefix2=b.
while read r_line; do
    c2=$(echo $r_line | cut -d'|' -f2)
    c4=$(echo $r_line | cut -d'|' -f4)
    s1=$(echo $c2 | sed "s/,/,$prefix1/g" | sed "s/^/$prefix1/g")
    s2=$(echo $c4 | sed "s/,/,$prefix2/g" | sed "s/^/$prefix2/g")
    echo "this is final string $s1=$s2"
done

Скрипт выполняет поиск ,и вместо этого ,$prefixи, наконец, добавляет $prefixв начало. И мне нравится использовать cutдля разделения строк.

0
18.03.2021, 23:21

Вы можете прочитать каждую строку, использовать cut, чтобы получить каждое поле и использовать sedдля них.

while read -r line; do
a="$(cut -d'|' -f2 <<<"$line")"
b="$(cut -d'|' -f4 <<<"$line")"
a="$(echo "$a"|sed -e 's/^/a./' -e 's/,/,a./g')"
b="$(echo "$b"|sed -e 's/^/b./' -e 's/,/,b./g')"
echo "this is final string $a=$b"
done < csv_file 
0
18.03.2021, 23:21

полное решение awk

файл awk (se.awk)

BEGIN { FS="|" }
{
  a="" ; n=split($2,A,",") ; for (i=1;i<=n;i++) a = a ",a." A[i] ;
  b="" ; n=split($4,B,",") ; for (i=1;i<=n;i++) b = b ",b." B[i] ;
  printf "%s %s=%s\n",prefix,substr(a,2),substr(b,2) ;
}

называется

awk -v prefix="this is final string" -f se.awk c
this is final string a.c1=b.t1
this is final string a.c1,a.c2=b.t1,b.t2

где

  • -v prefix="this is final string"установить переменную prefixв командной строке
  • BEGIN { FS="|" }указать awk использовать |в качестве разделителя
  • a="" ; n=split($2,A,",")Поле доли секунды на ,и счет
  • for (i=1;i<=n;i++) a = a ",a." A[i]построить ожидаемую строку с нежелательной запятой в начале
  • (то же самое касается b на четвертой позиции)
  • prefix="this is final string"собрать строку с помощью printf, чередуя запятую

если префикс фиксированный, то его можно вставить в программу awk

BEGIN { 
  FS="|" ;
  prefix="this is prefix" ; 
}
0
18.03.2021, 23:21

Вы можете сделать все это внутри bash, прочитав файл csv в массив, а затем выведя 2-е и 4-е поля, сначала выполнив подстановку параметров в них

while IFS='|' read -ra a;do
  echo This is the final string: \
    "a.${a[1]//,/,a.}=b.${a[3]//,/,b.}"
done < csvfile
1
18.03.2021, 23:21

Теги

Похожие вопросы