Обработка текста - присоединяется к каждым двум строкам с запятыми

Можно установить apt-get install также vim-gtk или vim-gnome или даже vim-lesstif получить a vim gui.

36
07.07.2016, 00:16
10 ответов

Просто используйте 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, - -
42
27.01.2020, 19:36
  • 1
    Только упомянуть это снова. Номера строки не являются частью файла :) –  mtk 17.10.2012, 21:06
  • 2
    paste управляйте отлично работает, можете Вы давать немного больше объяснения об этом. Дефисы??? –  mtk 17.10.2012, 21:08
  • 3
    Дефисы означают "чтение от stdin". Если тот же входной источник повторяется, вставка знает для чтения из него несколько раз на строку вывода. –  dubiousjim 17.10.2012, 21:13
  • 4
    @sch: охладите редактирование, я не коснусь его :-) –  January 18.10.2012, 13:35
  • 5
    Относительно Вашего cat аргумент. Делает sed "N;s/\n/,/" file.in > file.out не работают? –  Bernhard 18.10.2012, 14:13
sed 'N;s/\n/,/' file

Используя sed, соединение (N) каждые 2 строки и замена новая строка (\n) с"".

3
27.01.2020, 19:36

Вот является острота (хотя потенциально 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.

То, что все команды в цикле создаются в оболочке, делает свою производительность приемлемой и еще быстрее, чем другие решения для маленьких файлов. Но многие люди считали бы это плохой практикой, и нужно быть осторожным при обобщении его к чему-либо еще.

2
27.01.2020, 19:36
  • 1
    в общем yay для использования подоболочек для локализации изменений среды. Но в этом случае это не нужно: можно вместо этого сделать 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
  • 2
    @dubiousjim: -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 путь),

3
27.01.2020, 19:36

Для полного набора ответов, возможного awk решение может быть:

awk 'NR%2==1 {printf $0","} NR%2==0 { print $0}' *file*
2
27.01.2020, 19:36
  • 1
    @downvoter: Что не так с моим ответом для получения downvote? Как это может быть улучшено? –  Bernhard 18.10.2012, 23:38
  • 2
    Возможно, потому что ленивое printf? Перестанет работать в редком случае, когда имя станции будет содержать спецификатор формата. (См. pastebin.com/wgxFttrJ для примера.), Но это - просто предположение, downvote не от меня. –  manatwork 19.10.2012, 12:54

Возможный с жемчугом также,

perl -pe 's/^\d+\.\s+//;$.&1?chomp:print","' file

0
27.01.2020, 19:36

В случае, если любой приземляющийся здесь надеется комбинировать все строки в CSV один лайнер, попробовать

cat file | tr '\n' ','
8
27.01.2020, 19:36

Старый каштан awk идиомы

awk '{ORS=NR%2?",":"\n";print}' file
Station Name,Station Code
A N DEV NAGAR,ACND
ABHAIPUR,AHA
ABOHAR,ABS
ABU ROAD,ABR
1
27.01.2020, 19:36

Например:

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
0
27.01.2020, 19:36

Solución POSIX conpr:

pr -2 -a -t -s, file

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pr.html

0
27.01.2020, 19:36

Теги

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