Есть IS разница, хотя в вашем случае это не имеет значения. Я не умею рисовать, поэтому попытаюсь описать это словами:
ssh -NfL 192.168.121.215:2222:vm2.local:22 vm2.local
Это делает зашифрованное соединение между ваш хост и vm2.local
и порт перенаправляются через этот безопасный канал, потому что каждая сторона (локальная и удаленная) связывает свой локальный IP-адрес.
ssh -NfL 192.168.121.215:2223:localhost:22 vm2.local
Это то же самое, что и выше, но вы привязываете не адрес общедоступного сетевого интерфейса, а локальный ( 127.0.0.1
). Для порта ssh нет никакой разницы (он прослушивает оба), но это имеет значение для служб, прослушивающих только на localhost
(например, mysql
).
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
$ 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
.
В одну сторону, с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
Использование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
С помощью для демонстрации с помощью awk
фильтрации по двум строкам:
awk 'BEGIN { FS=","; OFS="," } { if( NR == 77 || NR == 132 ) {for( i=1; i<=NF; i++) {$NF="N/A"} }; print }' input
Просто добавьте дополнительные параметры в оператор if
для всех рассматриваемых строк.
sed
делает это:
sed '77s/.*/N\/A,N\/A,N\/A,N\/A/;137s/.*/N\/A,N\/A,N\/A,N\/A/;...' YourFile
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
Примечание:
Еще один способ с 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
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