Можно установить apt-get install
также vim-gtk
или vim-gnome
или даже vim-lesstif
получить a vim
gui.
Просто используйте cat
(если Вам нравятся кошки ;-)) и paste
:
cat file.in | paste -d, - - > file.out
Объяснение: paste
чтения из многих файлов и вставки вместе соответствующие строки (строка 1 из первого файла со строкой 1 из второго файла и т.д.):
paste file1 file2 ...
Вместо имени файла мы можем использовать -
(тире). paste
проводит первую строку от file1 (который является stdin). Затем это хочет считать первую строку из file2 (который является также stdin). Однако, так как первая строка stdin была уже считана и обработана, что теперь ожидает на входном потоке, вторая строка stdin, который paste
счастливо связующие звенья к первому. -d
опция устанавливает разделитель, чтобы быть запятой, а не вкладкой.
С другой стороны, сделайте
cat file.in | sed "N;s/\n/,/" > file.out
P.S. Да, можно упростить вышеупомянутое до
< file.in sed "N;s/\n/,/" > file.out
или
< file.in paste -d, - - > file.out
который имеет преимущество не использования cat
.
Однако я не использовал эту идиому нарочно по причинам ясности - это является менее подробным, и мне нравится cat
(КОШКИ ХОРОШИ). Поэтому не редактируйте.
С другой стороны, если Вы предпочитаете вставку кошкам (вставка является командой для конкатенации файлов горизонтально, в то время как кошка связывает их вертикально), можно использовать:
paste file.in | paste -d, - -
sed 'N;s/\n/,/' file
Используя sed, соединение (N) каждые 2 строки и замена новая строка (\n) с"".
Вот является острота (хотя потенциально millions-of-commands-run-er) использованием чистого Bash:
(IFS=; while read -r name; do read -r code; printf '%s\n" "$name,$code"; done < file.in) > file.out
Я использую подоболочку (круглая скобка) так, чтобы я не должен был сохранить и восстановить IFS
. Который иначе должен сделать относительно не, портят пользовательскую среду в случае, если источник получен. Альтернатива должна была бы передать ту новую IFS только read
как в IFS= read -r name
, IFS= read -r code
.
То, что все команды в цикле создаются в оболочке, делает свою производительность приемлемой и еще быстрее, чем другие решения для маленьких файлов. Но многие люди считали бы это плохой практикой, и нужно быть осторожным при обобщении его к чему-либо еще.
while IFS='\n' read -r name; do IFS='\n' read -r code ... done < file.in
, который является идиомой, я часто вижу в сценариях оболочки. -r
флаг к read
означает, "интерпретируют символ '\' сопровождаемый символом 'n' в stdin потоке как два символа, а не как новая строка". Возможно, это может быть более эстетично для создания подоболочки, как Вы делаете, чем повториться IFS='\n'
.
– dubiousjim
18.10.2012, 01:10
-r
улучшенный решение технически.Отлично! Я не поклонник идеи передать измененный IFS
дважды. Если я использовал чтение того, супер хорошее, но не дважды. Конечно, это - дело вкуса. Используя подоболочку немногим выше общего знания Bash, которое я сказал бы, таким образом, много людей испытает затруднения при понимании ее цели. Это - плохая вещь.
– Deleted
18.10.2012, 01:41
paste -sd ',\n' file.in > file.out
Также обратите внимание, что, потому что мы просто заменяем один символ другим (любая новая строка с запятой), мы можем работать над входным файлом на месте:
paste -sd ',\n' file.in 1<> file.in
(но остерегайтесь, это не могло бы работать над системами не-Unix, которые имеют разделители CRLF (как Microsoft), что некоторые эмулировали POSIX paste
мог бы рассматривать в не-Unix путь),
Для полного набора ответов, возможного awk
решение может быть:
awk 'NR%2==1 {printf $0","} NR%2==0 { print $0}' *file*
printf
? Перестанет работать в редком случае, когда имя станции будет содержать спецификатор формата. (См. pastebin.com/wgxFttrJ для примера.), Но это - просто предположение, downvote не от меня.
– manatwork
19.10.2012, 12:54
Возможный с жемчугом также,
perl -pe 's/^\d+\.\s+//;$.&1?chomp:print","' file
В случае, если любой приземляющийся здесь надеется комбинировать все строки в CSV один лайнер, попробовать
cat file | tr '\n' ','
Старый каштан awk
идиомы
awk '{ORS=NR%2?",":"\n";print}' file
Station Name,Station Code
A N DEV NAGAR,ACND
ABHAIPUR,AHA
ABOHAR,ABS
ABU ROAD,ABR
Например:
seq 0 70 | xargs -L 2 | sed 's/ /,/g'
Вывод: ( примечание: xargs -L number_of_columns
отлично работает с любым количеством колонок, а не только через каждые две строки)
0,1
2,3
4,5
6,7
8,9
10,11
12,13
14,15
16,17
18,19
20,21
22,23
24,25
26,27
28,29
30,31
32,33
34,35
36,37
38,39
40,41
42,43
44,45
46,47
48,49
50,51
52,53
54,55
56,57
58,59
60,61
62,63
64,65
66,67
68,69
70
Solución POSIX conpr
:
pr -2 -a -t -s, file
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pr.html
paste
управляйте отлично работает, можете Вы давать немного больше объяснения об этом. Дефисы??? – mtk 17.10.2012, 21:08cat
аргумент. Делаетsed "N;s/\n/,/" file.in > file.out
не работают? – Bernhard 18.10.2012, 14:13