AWK и sed являются полными по Тьюрингу , поэтому все, что может делать один, может делать и другой. (Что касается преобразования текста, то есть awk имеет больше возможностей взаимодействия с ОС.) Однако у каждой есть свои сильные и слабые стороны. Awk может легко делать большую часть того, что может делать sed, но некоторые вещи, такие как замена регулярных выражений группами, являются более сложными. Теоретически Sed может делать все, что умеет awk, но со значительными трудностями (например, в sed нет целочисленной арифметики, поэтому вам придется кодировать его с помощью текстовых преобразований). Поэтому, если вы хотите объединить все в одной команде, лучше всего подойдет awk.
awk 'NR==1 {print "D,,3"; next} {$1=""; print $0}' file.txt
Здесь sed также может легко делать то, что вы делаете с awk: нормализовать пробелы и сокращать все до первого пробела.
sed "s/[ \t][ \t]*/ /g; s/^ *[^ ][^ ]*/ /; s/^ $//; 1s/.*/D,,3/" file.txt
Комбинирование двух команд здесь не особенно полезно. Я не ожидаю прироста производительности. Для каждого канала наблюдается снижение производительности, поскольку данные должны передаваться от одной команды к другой. Однако может быть и повышение производительности. Если у вас несколько процессоров, две команды могут выполняться параллельно. Если для определенных вещей используется более специализированная команда (например,используя специальные инструменты, такие как grep
и head
вместо универсального инструмента, такого как awk), эта более специализированная команда обычно выполняется быстрее. Компенсируют ли выигрыши накладные расходы канала, зависит от данных, от инструментов, от того, сколько у вас ядер и т. Д.
Если этот сценарий не является узким местом производительности, сначала подумайте о ясности. В этом случае я бы избегал чистой версии sed - она может быть немного быстрее, но гораздо менее читабельна. (Возможно, это можно упростить при определенных предположениях о ваших данных, например, если вы знаете, что всегда будет как минимум два поля и что разделитель полей всегда будет одним пробелом, или вы не заботитесь о сохранении количества пробелов.) Я считаю, что проще делать все в awk, но это почти ничто между этим и вашей версией awk + sed.
Думаю, я смог решить проблему, с которой столкнулся. После выполнения ipfs init
создается 15 новых файлов, каждый из которых находится в папке с уникальным именем. Эти файлы не следует удалять (. Я предполагаю, что эти файлы содержат корень дерева Меркла ). Я использовал следующую строку sudo chattr +i */*
, чтобы сделать их неизменяемыми.
~/.ipfs/blocks$ ls
CIQBE CIQCC CIQDT CIQFF CIQGC CIQJ2 CIQJB CIQJX CIQKZ CIQOA CIQOL
CIQBG CIQD4 CIQF2 CIQFT CIQIF CIQJA CIQJF CIQKK CIQO2 CIQOH
~/.ipfs/blocks$ ls *
CIQBE:
CIQBED3K6YA5I3QQWLJOCHWXDRK5EXZQILBCKAPEDUJENZ5B5HJ5R3A.data
CIQBG:
CIQBGFIS77LXFM54VZKTDSZ3VKRE6ITTNAQEFHMC2H3ESKBPC3BVCYA.data
...
Далее перед запуском ipfs add <file_name>
, sudo umount ~/.ipfs/blocks/
следует выполнить. Это заставит ipfs
поверить, что существуют только те файлы и папки, которые созданы сразу после выполнения ipfs init
. (Внутри моей папки ~/.ipfs/blocks должны содержаться только папки и файлы, созданные сразу после выполнения ipfs init
.)
Я должен перепроверить, но я считаю, что каждое имя файла *.data
уникально в отношении содержащейся в нем информации, поэтому одинаковое имя файла каждого <file>.data
не будет создано. Таким образом, перезапись в тот же файл .dat
не будет проблемой.
В дальнейшем новые сгенерированные файлы и папки через ipfs add <filename>
следует скопировать на внешний диск и удалить из папки ~/.ipfs
.
Прежде чем делать какие-либо ipfs cat <hash-id>
мы должны сделать:
sudo mount -t cifs //<ip_address>/mybloc/ ~/.ipfs/blocks/ -o username=admin,password=my_password,uid=1000
Это приведет к тому, что ipfs получит доступ к уже созданным .data
файлам, которые фактически существуют на внешнем диске.