Вы можете сделать это более эффективно в awk: выйти, как только вы нажмете соответствующую строку.
awk 'NR==132 {if (/^#termcapinfo[[:space:]]*xterm Z0=/) found=1; exit}
END {exit !found}' /etc/screenrc
В качестве альтернативы вы можете использовать GNU sed (но переносимый sed не позволяет указать код выхода).
В качестве альтернативы вы можете использовать философию объединения инструментов Unix: извлечь нужную строку с помощью head
и tail
и передать ее в grep
.
Или вы можете использовать sed для извлечения нужной строки:
(Оба из них полагаются на тот факт, что вы хотите получить одинаковый результат для пустой строки и для слишком короткого файла.)
Для такого small, самым быстрым подходом, вероятно, будет тот, который использует один инструмент, поскольку накладные расходы на запуск нескольких программ будут больше, чем выигрыш в производительности от использования специальных инструментов, таких как head
, tail
и sed
.Если вам нужна строка 132000000, начало с tail -n +132000000
, вероятно, будет быстрее, чем что-либо еще.
Только с sed
:
sed -E 's/"//g; s/^([^,]*,){2}//' infile
s/"//g
, удаляет все двойные кавычки. ^([^,]*,){2}
, начните с начала строки, уберите все, за чем следует запятая, и повторите это максимум два раза. Или сawk
:
awk -F\" '{$1=$2=$3=$4=$5=""}1' OFS="" infile
Похоже дело просто или убрать кавычки и потом печатать с 3-го поля до конца строки:
$ tr -d \" < file | cut -d, -f3-
net2-thrift-netconf,net.driver.memory,2
net2-thrift-netconf,net.executor.cores,2
net2-thrift-netconf,net.executor.instances,2
net2-thrift-netconf,net.executor.memory,2
net2-thrift-netconf,net.sql.shuffle.partitions,141
net2-thrift-netconf,net.dynamicAllocation.enabled,true
net2-thrift-netconf,net.dynamicAllocation.initialExecutors,2
net2-thrift-netconf,net.dynamicAllocation.minExecutors,2
net2-thrift-netconf,net.dynamicAllocation.maxExecutors,20
Таким образом, tr -d \"
удаляет кавычки, а cut -d, -f3-
печатает от 3-го до последнего,
-разделенных полей.
Вы действительно должны использовать правильный анализатор CSV для данных CSV. Вот способ использования ruby
ruby -rcsv -e '
CSV.foreach(ARGV.shift) do |row|
wanted = row.drop(2) # ignore first 2 fields
puts CSV.generate_line(wanted, :force_quotes=>false)
end
' test
net2-thrift-netconf,net.driver.memory,2
net2-thrift-netconf,net.executor.cores,2
net2-thrift-netconf,net.executor.instances,2
net2-thrift-netconf,net.executor.memory,2
net2-thrift-netconf,net.sql.shuffle.partitions,141
net2-thrift-netconf,net.dynamicAllocation.enabled,true
net2-thrift-netconf,net.dynamicAllocation.initialExecutors,2
net2-thrift-netconf,net.dynamicAllocation.minExecutors,2
net2-thrift-netconf,net.dynamicAllocation.maxExecutors,20
или в виде одного -вкладыша
ruby -rcsv -e 'CSV.foreach(ARGV.shift) {|r| puts CSV.generate_line(r.drop(2), :force_quotes=>false)}' test