Если значения умещаются в памяти, что ваше «до 500» должно, и в зависимости от того, что именно вы хотите, awk
, вероятно, сможет сделать это за один проход и (по крайней мере, в большинстве случаев) за один процесс.
Чтобы перечислить все без исключения значения, которые встречаются один раз, в произвольном порядке, если их больше одного:
awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1)print a[v],v}'
# can pipe output to a suitable sort if you want a specific order
# or for GNU awk 4, you can get several non-arbitrary orders
# (less than GNU sort) using PROCINFO["sorted_in"] see the manual
Чтобы перечислить одно значение, которое встречается один раз, если есть хотя бы одно:
awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit}}'
Чтобы перечислить одно значение, которое встречается один раз и в противном случае указывает, что их нет:
awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit};print "no unique entry"}'
Используйте следующее выражениеsed:
sed 's/^\(xfirst[[:space:]]*=[[:space:]]*\).*/\1-180/' file
\1
-указывает на 1-ю захваченную группу (т.е.(xfirst....)
)Вы забыли заключить в кавычки оператор glob [[:space:]]
и используете такую оболочку, как csh
, tcsh
, fish
(, хотя fish
не поддерживает [...]
операторы glob ), zsh
,bash -O failglob
(скорее всего (t)csh
учитывая сообщение об ошибке )о том, что (правильно )не удается выполнить команду, когда глобус не совпадает.
tcsh
не распознает [:space:]
классы символов POSIX, но этот s/=[[:space:]]0/-180/
по-прежнему распознается как глобус.
После mkdir -p 's/=a]0/-180'
глобус будет совпадать. Это s/=[[:space:]]0/-180/
будет расширено до s/=a]0/-180/
, и вы не получите ошибку No match
.
Вместо этого здесь вы хотите процитировать это, чтобы оболочка не рассматривала его как шаблон глобуса и передала строку буквально в sed
.
(Здесь я также добавляю отсутствующий *
, чтобы разрешить 0 или более символов пробела в шаблоне, и отсутствующий =
в качестве замены):
sed 's/=[[:space:]]*0/=-180/'
Или сохранить исходный интервал:
sed 's/\(=[[:space:]]*\)0/\1-180/'
Другой sed
командный подход.
sed '/^xfirst/ s/\d\+/-180/'
или так.
sed '/^xfirst/ s/[0-9]+/-180/'
или просто замените 0
на-180
sed '/^xfirst/ s/0/-180/'