xargs
может не быть лучший инструмент, который я предложил бы fgrep
если Ваш file-of-strings-to-match только содержит строки, не регулярные выражения.
fgrep -f strings.txt subdirectory/*
Я предлагаю fgrep
как традиционный Unix grep
и egrep
не имел "-f" опции. Я верю тому GNU grep
и egrep
действительно имейте "-f" опцию, поэтому если бы Ваш файл имеет регулярные выражения в нем, Вы хотели бы использовать версию GNU.
На Вашей версии SunOS
nawk
(или в этом отношении awk
) должен смочь добиться цели
nawk -F';' 'BEGIN{OFS=";"}{print($1,$2,$3,$(NF-1),$(NF))}' file.txt
Вот решение нескольких-команд для получения первых 3 и последних 2 полей с помощью только cut
, rev
(для инвертирования) и оболочка-builtins:
while read line
do
first=$(echo -n "$line" | cut -d ";" -f -3)
second=$(echo -n "$line" | rev | cut -d ";" -f -2 | rev)
echo "$first;$second"
done < my_file
Эти операторы могут также быть помещены в одну строку, конечно.
Править:
Я собрал некоторые короткие альтернативы rev
(которые опускают печатать финал '\n'):
Python: python -c "import sys; sys.stdout.write(raw_input()[::-1])
жемчуг: perl -ne 'chomp;print scalar reverse;'
и существует намного больше возможностей для инвертирования строки. Возможно, некоторые из тех работают над Вашей системой.
rev
не установлен на моем сервере (SunOS 5.10)
– Romain Linsolas
07.01.2013, 16:59
rev
прибывает из util-linux
пакет, который содержит различные существенные команды для Linux. Интересно, имеет ли SunOS подобную команду.
– scai
07.01.2013, 17:01
% cat a
1;foo;bar;#@$"é&^l#;baz;x;y;z
2;foo;bar;#¤=é;)o'#;baz;x;y;z
3;foo;bar;#]]'~é{{#;baz;x;y;z
% sed -r 's,^(([^;]+;){3}).*;([^;]+;[^;]+)$,\1\3,' < a
1;foo;bar;y;z
2;foo;bar;y;z
3;foo;bar;y;z
sed
слишком старо, поскольку Ваша команда бросает a sed: illegal option -- r
:(
– Romain Linsolas
07.01.2013, 17:00