Столбцы Merging Two Files в порядке

Взгляните на названную утилиту командной строки 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 случай, от канала) вместо файла.

3
12.09.2016, 14:23
5 ответов
[118080] Вы можете использовать [118455]join

-t\;[118458] использует точку с запятой в качестве разделителя полей, а в списке [118459]-o[118460] указано, какие поля нужно распечатать в каком порядке. При этом не будут печататься строки ни в одном из файлов, не имеющие совпадения в другом; для этого можно добавить [118461]-a1[118462] (для первого файла) или [118463]-a2[118464] (для второго).[118083].

6
27.01.2020, 21:09
[118042]Попробуйте это:

Выход:

2
27.01.2020, 21:09
[118178] Вот короче [118637] awk[118638]: [12159]
1
27.01.2020, 21:09
[118058] Так вот что я использовал, чтобы получить исходный материал:

Он поставляет:

Я тестировал это различными способами, и в результате получилась команда:

Это [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] на ваших данных и:

enter image description here

Вот как это работает:

N

потому что мы уже знаем, что [118763]sed[118764] присоединяет каждую последующую строку от [118765]f2[118766] к той, что в [118767]f1[118768], самое первое, что мы делаем после получения строки, это тянем за [118769]N[118770]ext. одну.


s

соединив две нужные нам линии в пространстве шаблона, мы начинаем [118855]s[118856]earch и заменяем функцию

001;abc;def;ghi;jkl

;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

\2 (;[^;]*)\n

она встречает строку, состоящую из...

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(. *)

мы храним все, что осталось, в [118889]\3[118890] обратной ссылке

\1\3\2

enter image description here

enter image description here

после того, как мы разделили строку, так как нам нужно, чтобы все, что осталось, было собрано обратно в правильном порядке, поэтому мы вставляем [118893] \3[118894] перед [118895] \2[118896] и заканчиваем этот цикл поиска замены до тех пор, пока не подадим новую строку

1
27.01.2020, 21:09

Теги

Похожие вопросы