У меня есть более 1000 строк в файле. Файл начинается следующим образом (добавляются номера строк):
Station Name
Station Code
A N DEV NAGAR
ACND
ABHAIPUR
AHA
ABOHAR
ABS
ABU ROAD
ABR
Мне нужно преобразовать это в файл с разделенными запятыми записями, соединяя каждые две строки. Окончательные данные должны выглядеть
Station Name,Station Code
A N DEV NAGAR,ACND
ABHAIPUR,AHA
ABOHAR,ABS
ABU ROAD,ABR
...
Я пытался написать сценарий оболочки, а затем echo
запятую между ними. Но я думаю, что более простая эффективная однострочная работа могла бы быть здесь, в sed
/ awk
.
Любые идеи?
text-processing
paste
холодный морской тропический воздух
источник
источник
Ответы:
Просто используйте
cat
(если вы любите кошек ;-)) иpaste
:Объяснение:
paste
читает из ряда файлов и вставляет вместе соответствующие строки (строка 1 из первого файла со строкой 1 из второго файла и т. Д.):Вместо имени файла мы можем использовать
-
(тире).paste
берет первую строку из file1 (который является stdin). Затем он хочет прочитать первую строку из файла file2 (который также является stdin). Однако, так как первая строка stdin уже была прочитана и обработана, то, что теперь ожидает во входном потоке, является второй строкой stdin, котораяpaste
успешно приклеивается к первой.-d
Опция устанавливает разделитель быть запятая , а не вкладка.Или сделать
PS Да, выше можно упростить до
или
который имеет преимущество не использовать
cat
.Тем не менее, я не использовал эту идиому нарочно , для наглядности - это менее многословным , и я , как
cat
(Кошкам NICE). Поэтому, пожалуйста, не редактируйте.В качестве альтернативы, если вы предпочитаете вставлять кошки (команда вставки объединяет файлы по горизонтали, а кошка объединяет их по вертикали), вы можете использовать:
источник
paste
отлично работает, не могли бы вы дать немного больше объяснений по этому поводу. Дефисы ???cat
аргумента. Неsed "N;s/\n/,/" file.in > file.out
работает?В случае, если кто-то приземлится здесь хочет объединить все линии в один лайнер CSV, попробуйте
источник
Используя sed, объедините (N) каждые 2 строки и замените символ новой строки (\ n) на «,».
источник
Также обратите внимание, что, поскольку мы просто заменяем один символ другим (каждый новый перевод строки запятой), мы можем работать с входным файлом на месте:
(но учтите, что он может не работать на не-Unix-системах, которые имеют терминаторы CRLF (например, Microsoft), которые некоторые эмулированные POSIX
paste
могут обрабатывать не-Unix-способом)источник
1
делает здесь1<>
? это опечатка?Вот одна строка (хотя, возможно, миллионы команд-запуска-er), использующая чистый Bash:
Я использую подоболочку (парантез), чтобы мне не пришлось хранить и восстанавливать
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
означает «интерпретировать символ„\“ , за которой следует символ„п“в потоке стандартного ввода в виде двух символов, а не как символ новой строки.» Возможно, было бы более эстетично создавать подоболочку, чем вы, чем повторятьIFS='\n'
.-r
улучшено техническое решение. Большой! Я не фанат идеи прохождения измененногоIFS
дважды. Если бы я использовал одно чтение, супер приятно, но не дважды. Конечно, это вопрос мнения . Я бы сказал, что использование подоболочки немного превышает общие знания Bash, поэтому многим людям будет сложно понять его назначение. Это плохо.Для полного набора ответов возможное
awk
решение может быть:источник
printf
? Сбой в редком случае, когда имя станции содержит спецификатор формата. (См. Пример pastebin.com/wgxFttrJ .) Но это всего лишь предположение, отрицательное мнение не от меня.Седой старый каштан
awk
идиомыисточник
awk '{ORS=NR%2?",":"\n"};1'
короче и более идиомаprint
что цель ясна.1
так же ясно для старыхawk
рук, как я, но я предпочитаюprint
sed
поиском, ноawk
облегчил объединение каждых 4 строк. Спас мне поездку на$EDITOR
!Возможно и с Perl,
perl -pe 's/^\d+\.\s+//;$.&1?chomp:print","' file
источник
Например:
Вывод: (примечание:
xargs -L number_of_columns
прекрасно работает с любым количеством столбцов, а не только с двумя строками)источник
POSIX решение с
pr
:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pr.html
источник