Взгляните на названную утилиту командной строки cut
. Это может извлечь столбцы, если они разделяются уникальным разделителем. Для переобъединения частей, можно использовать paste
.
Если Вы имеете, например, типичный разделенный от запятой формат
$ cat debts.csv
Name,Age,Debt
Alice,20,1337
Bob,30,42
$ cat pets.csv
Name,Pet
Alice,Dog
Bob,Cat
Вы могли извлечь имена и долги с
$ cut -d, -f1,3 debts.csv
Name,Debt
Alice,1337
Bob,42
и долги объединения с использованием домашних животных
$ cut -d, -f2 pets.csv | paste -d, debts.csv -
Name,Age,Debt,Pet
Alice,20,1337,Dog
Bob,30,42,Cat
cut
и paste
, -d
определяет разделитель для полей,-f
выбирает столбцы для извлечения для cut
и-
предписывает использовать стандартный вход (т.е. в последнем paste
случай, от канала) вместо файла.-t\;[118458] использует точку с запятой в качестве разделителя полей, а в списке [118459]-o[118460] указано, какие поля нужно распечатать в каком порядке. При этом не будут печататься строки ни в одном из файлов, не имеющие совпадения в другом; для этого можно добавить [118461]-a1[118462] (для первого файла) или [118463]-a2[118464] (для второго).[118083].
Он поставляет:
Я тестировал это различными способами, и в результате получилась команда:
Это [118401] GNU [118759] sed[118760] только [118402] - потому что GNU предлагает функцию [118403] R[118404], которую мы можем прочитать в отдельном файле построчно, пошагово с нашим входом. Это означает отсутствие разветвления и петлеобразования. Таким образом, я ожидаю, что [118405]sed[118406] будет работать более эффективно, чем [118407]awk[118408], потому что ему не нужно будет полностью считывать содержимое в память перед операцией, и он может работать в реальном потоке.
Я пытался сделать эту работу без [118409] |pipe[118410] и второго [118411]sed[118412] вызова, но поскольку [118413]sed[118414] добавляет [118415]/tmp/f2[118416] к своему [118417]stdout[118418], ничто из того, что я пытался сделать, не позволяло мне редактировать в потоке без [118419]|pipe[118420]. [118421]sed[118422] сначала соединяет два файла в потоке и редактирует результат на другом конце [118423]|pipe[118424].
В любом случае, один [118425]|pipe[118426] хоть и потоковый, но вам нужно два [118427]sed[118428]s . Выполните вышеприведенную команду [118429]sed[118430] на ваших данных и:
Вот как это работает:
N
потому что мы уже знаем, что [118763]sed[118764] присоединяет каждую последующую строку от [118765]f2[118766] к той, что в [118767]f1[118768], самое первое, что мы делаем после получения строки, это тянем за [118769]N[118770]ext. одну.
s
соединив две нужные нам линии в пространстве шаблона, мы начинаем [118855]s[118856]earch и заменяем функцию
;pqr\n001;mno
\1 (...) *)
MouseMove(1440, 900, 0)
first tell [118861]sed[118862] to [118863]([118864] group * everything it [118865])[118866] find from the left-most part of the pattern space into the [118867]\1[118868] back-rerencing until. ...
001;abc;def;ghi;jkl*[118869];pqr*[118870]\n001;mno
она встречает строку, состоящую из...sudo /usr/libexec/PlistBuddy /System/Library/LaunchDaemons/com.apple.syslogd.plist
add :Sockets:NetworkListener dict
add :Sockets:NetworkListener:SockServiceName string syslog
add :Sockets:NetworkListener:SockType string dgram
save
quit
; точка с запятой затем ...[118874] [118875][118911][118937][^;]*
sudo launchctl unload com.apple.syslogd.plist
sudo launchctl load com.apple.syslogd.plist
строка, полностью состоящая из ^no ; точки с запятой, за которыми следует
$ sudo lsof -i:514
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
launchd 1 root 44u IPv6 0x0e459370 0t0 UDP *:syslog
launchd 1 root 56u IPv4 0x0f7a9ef0 0t0 UDP *:syslog
syslogd 24319 root 5u IPv6 0x0e459370 0t0 UDP *:syslog
syslogd 24319 root 6u IPv4 0x0f7a9ef0 0t0 UDP *:syslog
\n
\n[118915]\n[118916]ewline символ, добавленный при вытягивании строки [118917]f2[118918] с [118919]N[118920], и который будет отброшен.
()
Таким образом, мы возвращаемся к ссылке [118923]([118924] последнее поле с точкой с запятой [118925])[118926] из строки [118927] f1[118928] на [118929] \2[118930][118880]. [118782][118438] [118439][118783][118881][118931][^;]*
, начиная со строки [118883]f2[118884], мы перебираем и отбрасываем все символы до тех пор, пока не встретим точку с запятой, и
001;abc;def;ghi;jkl;pqr\n001*[118885];mno*
\3(. *)
\1\3\2