Замените все значения в одну строку в N / A

Есть IS разница, хотя в вашем случае это не имеет значения. Я не умею рисовать, поэтому попытаюсь описать это словами:

  1.  ssh -NfL 192.168.121.215:2222:vm2.local:22 vm2.local 
     

    Это делает зашифрованное соединение между ваш хост и vm2.local и порт перенаправляются через этот безопасный канал, потому что каждая сторона (локальная и удаленная) связывает свой локальный IP-адрес.

  2.  ssh -NfL 192.168.121.215:2223:localhost:22 vm2.local 
     

    Это то же самое, что и выше, но вы привязываете не адрес общедоступного сетевого интерфейса, а локальный ( 127.0.0.1 ). Для порта ssh нет никакой разницы (он прослушивает оба), но это имеет значение для служб, прослушивающих только на localhost (например, mysql ).

  3.  ssh -NfL 192.168.121.215:2224:vm2.local: 22 localhost 
     

    Этот сервер надежно подключается к вашему локальному хосту (в основном без эффекта безопасности), а затем напрямую связывает удаленный хост, поэтому все, что вы пишете на порт 2224 , отправляется непосредственно между машинами незашифрованный (здесь нет проблем для SSH-соединений, но это будет иметь значение для другого типа трафика).

Заключение

Вы должны научиться использовать второй случай, но когда перенаправляемый порт не требуется для доступа извне, вы всегда должны связывать localhost на локальной стороне, например:

ssh -NfL localhost:2223:localhost:22 vm2.local

, где по умолчанию используется localhost , поэтому вы можете сократить его до

ssh -NfL 2223:localhost:22 vm2.local
1
27.07.2018, 21:05
8 ответов
$ awk -F, -vOFS=, 'FNR==2 || FNR==4 { for (i=1;i<=NF;++i) $i="N/A" } 1' file
RS,RPHG,LPHG,RITC
N/A,N/A,N/A,N/A
-12.5663095454547,-33.8395547159089,-3.44606818181819,-24.8157817329538
N/A,N/A,N/A,N/A
-29.9357495454533,-34.5783047159075,-50.3323381818191,2.0808182670462

FNR— порядковый номер текущей записи в текущем файле («номер строки в текущем файле» ). Если их два или четыре, мы перебираем все поля (от 1 до NF, количество полей )и устанавливаем для каждого поля строку N/A. Замыкание 1в конце является кратким способом записи { print }и приведет к печати всех строк (, измененных или не измененных ).

Если у вас есть дополнительный файл со всеми номерами строк, которые следует удалить (по одному номеру в строке):

awk -F, -vOFS=, 'FNR==NR { a[$1]; next }
                 FNR in a { for (i=1;i<=NF;++i) $i="N/A" } 1' lines file

Где lines— файл с номерами строк.

Здесь, если FNR==NR, то мы читаем из первого файла (файл lines). В этом случае мы создаем запись в массиве aс номером строки в качестве ключа и продолжаем со следующей строки. NR— это общее число прочитанных на данный момент строк, и оно будет равно FNR, пока мы не начнем чтение со второго файла.

Если FNRне равно NR, то мы читаем второй файл (файл file, содержащий данные ). Затем мы проверяем, является ли текущий номер строки ключом в массиве a, и если это так, мы заменяем все поля, как и раньше, на N/A.

2
27.01.2020, 23:12

В одну сторону, сsed:

sed '
77c\
N/A,N/A,N/A,N/A
132c\
N/A,N/A,N/A,N/A
140c\
N/A,N/A,N/A,N/A
142c\
N/A,N/A,N/A,N/A
155c\
N/A,N/A,N/A,N/A
156c\
N/A,N/A,N/A,N/A
157c\
N/A,N/A,N/A,N/A
175c\
N/A,N/A,N/A,N/A
' input.csv
1
27.01.2020, 23:12

Использованиеawk:

awk -vOFS=, '{
  if (NR==77 || NR=132 || NR==140 || NR==142 || NR==155 || NR==156 || NR==157 || NR==175)
    $1=$2=$3=$4="N/A"
    print
}' input.csv

Чтобы создать новый файл с выводом, просто используйте оболочку >оператор перенаправления:

awk -vOFS=, '{
      if (NR==77 || NR=132 || NR==140 || NR==142 || NR==155 || NR==156 || NR==157 || NR==175)
        $1=$2=$3=$4="N/A"
        print
    }' input.csv > newfile.csv
1
27.01.2020, 23:12

С помощью для демонстрации с помощью awkфильтрации по двум строкам:

awk 'BEGIN { FS=","; OFS="," } { if( NR == 77 || NR == 132 ) {for( i=1; i<=NF; i++) {$NF="N/A"} }; print }' input

Просто добавьте дополнительные параметры в оператор ifдля всех рассматриваемых строк.

1
27.01.2020, 23:12

sedделает это:

sed '77s/.*/N\/A,N\/A,N\/A,N\/A/;137s/.*/N\/A,N\/A,N\/A,N\/A/;...' YourFile 
1
27.01.2020, 23:12
perl -F, -pale '
   $_ = join ",", qw[N/A] x @F
      if grep /^$.$/, qw/77 132 140 142 155 156 157  175/;
' input.csv

Или с GNU sedмы могли бы использовать сочетание переменных оболочки:

# give the rows to be made N/A in a comma separated fashion
rows2na='77,132,140,142,155,156,157,175'
b2sub=$(echo "$rows2na," | sed -e 's/,/ba\n/g')
sed -e "
    $b2sub
    b
    :a;s|[^,]*|N/A|g
" input.csv

Примечание:

  1. Убедитесь, что входной CSV-файл действительно разделен запятыми, а не какими-либо другими символами, например TAB.
  2. Убедитесь, что входной файл имеет окончание строки unix (перевод строки, также известный как новая строка "\n" ), а не windows или mac.
1
27.01.2020, 23:12

Еще один способ с sed

sed -E '
# for each needed rows jump to A
  77bA
  132bA
  140bA
  142bA
  155bA
  156bA
  157bA
  175bA
  b
  :A
# if the line is empty do nothing
    /^$/b
# Add comma at end of line
    s/$/,/
# Remove each not comma
    s/[^,]//g
# Substitute each comma by N/A,
    s/,/N\/A,/g
# Remove the last comma
    s/,$//
' infile
0
27.01.2020, 23:12

bash :это будет медленно

n=0
IFS=,
while read -ra fields; do
    case $((++n)) in
        77|132|140|142|155|156|157|175)
            for ((i=0; i<${#fields[@]}; i++)); do fields[i]="N/A"; done
            ;;
    esac
    echo "${fields[*]}"
done < file
0
27.01.2020, 23:12

Теги

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