2014-02-13 1 views
0

У меня есть input.txt, который содержит данные, как этогокоманды Unix вырезать файл и воссоздать новый один

123 

1234 

1223 

Я хочу это конвертировать в другой файл output.txt и файл должен выглядеть следующим образом

'123','1234','1223' 

Может кто-нибудь, пожалуйста, позвольте мне, как это можно сделать в unix?

+0

Есть ли ДЕЙСТВИТЕЛЬНО пустая строка между каждой строкой данных на вашем входе? –

ответ

0

Вы можете использовать sed

cat input.txt | sed -n "s!\(.*\)!'\1'!;H;\$!b;x;s!^\n!!;s!\n!,!g;p" 

Читайте каждую строку (не печатает по умолчанию -p), а затем добавить его в трюме H - то остановку для всех строк, кроме последней \$b. На последней строке - скопируйте пространство удержания в пространство рисунка. x, перенесите первую строку новой строки (в этом пространстве удержания есть начало новой строки), а затем замените оставшиеся строки новой строки на «,». Наконец распечатайте пространство с рисунком p.

Вы можете использовать PERL скрипт

#!/usr/bin/perl 

my @lines = <>; 
chomp(@lines); 
print join(',', map { "\"$_\"" } @lines), "\n"; 

./script input.txt 
+0

Спасибо большое Beano :) ...но я ищу команды только в unix – user3305824

+0

Обновленный ответ, чтобы дать sed альтернативу – Beano

2

Вы можете попробовать это,

tr -s '\n' < input.txt | sed "s/.*/'&'/g" | tr '\n' ',' | sed 's/,$//g' > output.txt 
+0

спасибо большому брату ....... «сидел» вы человек – user3305824

+0

Последний sed может просто быть /, $ // ' – Beano

+0

@Beano, да. Обновлен ответ. – sat

0

Я боюсь, что я не могу вам с Баш. Попробуйте это в Python:

InputFilepath = /path/to/input.txt 
OutputFilepath = /path/to/output.txt 

with open(InputFilepath, "r") as f: 
    words = f.read().splitlines() #may be not needed? 
    result = ','.join(f) 

with open(OutputFilepath, "w") as g: 
    g.write(result) 
0

Бьюсь об заклад, есть более чистый способ сделать это, но пока не можете его додумать.

#   1   2       3    4 
sed "/^[ \t]*$/d; s/\(.*\)/'\1'/" input.txt | tr "\n" "," | sed 's/,$//' 
  1. удалить заготовок линий (в том числе строк, содержащих пробелы/вкладки).
  2. добавить одиночные кавычки вокруг каждой строки
  3. заменить новую строку с запятой
  4. удалить отставая,
0

Вот awk версия

awk 'NF{s=s q$0q","} END {sub(/,$/,x,s);print s}' q="'" file 
'123','1234','1223' 

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

awk ' 
NF {    # When line is not blank, do: 
    s=s q$0q","} # Chain together all data with ' before and ', 
END {    # End block 
    sub(/,$/,x,s) # Remove last , 
    print s}  # Print the result 
    ' q="'" file # Helps awk to handle single quote in print, and read the file 
0

Wi й ГНУ AWK в течение нескольких символьного RS:

$ awk -v RS='\n+$' -v FS='\n+' -v OFS="','" -v q="'" '{$1=$1; print q $0 q }' file 
'123','1234','1223' 

Он просто читает весь файл в качестве одной записи (RS='\n+$') с использованием последовательностей смежных символов новой строки в качестве входного поля сепаратора (FS='\n+'), а затем перекомпилирует запись с помощью ',' как (OFS="','"), присвоив поле самому себе ($1=$1) и распечатает результат с помощью ' спереди и сзади.

Смежные вопросы