Unix каманды для пераўтварэння некалькіх радкоў дадзеных у адным радку разам з падзельнікам

Вось фактычныя дадзеныя файла:

abc
def
ghi
jkl
mno

І патрабаваная магутнасць павінна быць у наступным фармаце:

'abc','def','ghi','jkl','mno'

Каманда, што я выкарыстаў, каб зрабіць гэта дае выхад як:

abc,def,ghi,jkl,mno

Каманда выглядае наступным чынам:

sed -n 's/[0-3]//;s/ //;p' Split_22_05_2013 | \
  awk -v ORS= '{print $0" ";if(NR%4==0){print "\n"}}'
1
Прывітанне. І які ваш пытанне? Якія канкрэтныя праблемы ў вас ёсць?
дададзена аўтар Sebastian Mach, крыніца
Прывітанне. І які ваш пытанне? Якія канкрэтныя праблемы ў вас ёсць?
дададзена аўтар Sebastian Mach, крыніца
Прывітанне. І які ваш пытанне? Якія канкрэтныя праблемы ў вас ёсць?
дададзена аўтар Sebastian Mach, крыніца
Прывітанне. І які ваш пытанне? Якія канкрэтныя праблемы ў вас ёсць?
дададзена аўтар Sebastian Mach, крыніца

13 адказы

In response to sudo_O's comment I add an awk less solution in pure bash. It does not exec any program at all. Of course instead of < (here-is-the-document) stuff one could add .

set c=""
while read w; do
  echo -e "$c'$w'\c"
  c=,
done<

выхад:

'abc','def','ghi','jkl','mno'

Яшчэ больш кароткая версія:

printf -v out ",'%s'" $(

Без жахлівых змей трубы Вы можаце паспрабаваць нешта накшталт гэтага:

awk 'NR>1{printf ","}{printf "\x27%s\x27",$0}' <

выхад:

'abc','def','ghi','jkl','mno'

Ці іншы варыянт, які чытае ўвесь ўвод як адзін радок:

awk -vRS="" '{gsub("\n","\x27,\x27");print"\x27"$0"\x27"}'

Або версія, якая дазваляе AWK выкарыстоўвае ўнутраныя зменныя больш

awk -vRS="" -F"\n" -vOFS="','" -vORS="'" '{$1=$1;print ORS $0}'

<�Код> $ 1 = $ 1; неабходна, каб сказаць AWK перепаковать $ 0 з выкарыстаннем новых палёў і падзельнікаў запісаў ( OFS </код >, ORS ).

4
дададзена
@TrueY Дзякуй за ур адказ ........
дададзена аўтар 122user321, крыніца
Я аддаю перавагу AWK рашэнне хаха;)
дададзена аўтар Chris Seymour, крыніца
+1 За не само нерестовых суб-працэсаў. Звярніце ўвагу, што не выкарыстоўваючы прабел пасля -v не з'яўляецца пераносным.
дададзена аўтар Chris Seymour, крыніца
@PavanDongray: Задавальненне гэта маё! І Оскар ідзе ў ...? ;)
дададзена аўтар TrueY, крыніца
@sudo_O: Што перакрут! ;)
дададзена аўтар TrueY, крыніца
@sudo_O: У рэшце рэшт я ліквідаваны AWK а. :)
дададзена аўтар TrueY, крыніца
@sudo_O: Дзякуй за каментар! Я не ведаў па астраноміі пытанні! У Linux і HP-UX гэта працуе без яго.
дададзена аўтар TrueY, крыніца
$ cat test.txt
abc
def
ghi
jkl
mno

$ cat test.txt | tr '\n' ','
abc,def,ghi,jkl,mno,

$ cat test.txt | awk '{print "\x27" $1 "\x27"}' | tr '\n' ','
'abc','def','ghi','jkl','mno',

$ cat test.txt | awk '{print "\x27" $1 "\x27"}' | tr '\n' ',' | sed 's/,$//'
'abc','def','ghi','jkl','mno'

Апошняя каманда можа быць скарочана, каб пазбегнуць UUOC :

$ awk '{print "\x27" $1 "\x27"}' test.txt | tr '\n' ',' | sed 's/,$//'
'abc','def','ghi','jkl','mno'
3
дададзена
@miku дзякуй .....
дададзена аўтар 122user321, крыніца
@miku я хачу выснову як 'ABC', 'ОПР', 'ГХИ', 'JKL', '' MnO
дададзена аўтар 122user321, крыніца
Гэта, здаецца, адсутнічаюць каціроўкі, па-ранейшаму.
дададзена аўтар Jonathan Leffler, крыніца
І апошні СЕПГ 's /, $ //' ачышчае ...
дададзена аўтар Jonathan Leffler, крыніца
@miku - Некаторыя людзі не любяць файл кошка | other_command . Яны аддаюць перавагу other_command файл . +1 ўсё роўна.
дададзена аўтар mouviciel, крыніца
@PavanDongray: Мовы: Паведамленні двукоссі.
дададзена аўтар miku, крыніца
@mouviciel: Паведамленні нататка на UUOC, дзякуй.
дададзена аўтар miku, крыніца
@JonathanLeffler: Я люблю трубу.
дададзена аўтар miku, крыніца
Э-э ... The AWK ... | тр ... | СЕПГ ... даволі ўражвае, але трохі бессэнсоўна. <�Код> Awk можа справіцца з гэтым.
дададзена аўтар TrueY, крыніца
$ cat test.txt
abc
def
ghi
jkl
mno

$ cat test.txt | tr '\n' ','
abc,def,ghi,jkl,mno,

$ cat test.txt | awk '{print "\x27" $1 "\x27"}' | tr '\n' ','
'abc','def','ghi','jkl','mno',

$ cat test.txt | awk '{print "\x27" $1 "\x27"}' | tr '\n' ',' | sed 's/,$//'
'abc','def','ghi','jkl','mno'

Апошняя каманда можа быць скарочана, каб пазбегнуць UUOC :

$ awk '{print "\x27" $1 "\x27"}' test.txt | tr '\n' ',' | sed 's/,$//'
'abc','def','ghi','jkl','mno'
3
дададзена
@miku я хачу выснову як 'ABC', 'ОПР', 'ГХИ', 'JKL', '' MnO
дададзена аўтар 122user321, крыніца
@miku дзякуй .....
дададзена аўтар 122user321, крыніца
Гэта, здаецца, адсутнічаюць каціроўкі, па-ранейшаму.
дададзена аўтар Jonathan Leffler, крыніца
І апошні СЕПГ 's /, $ //' ачышчае ...
дададзена аўтар Jonathan Leffler, крыніца
@miku - Некаторыя людзі не любяць файл кошка | other_command . Яны аддаюць перавагу other_command файл . +1 ўсё роўна.
дададзена аўтар mouviciel, крыніца
@mouviciel: Паведамленні нататка на UUOC, дзякуй.
дададзена аўтар miku, крыніца
@PavanDongray: Мовы: Паведамленні двукоссі.
дададзена аўтар miku, крыніца
@JonathanLeffler: Я люблю трубу.
дададзена аўтар miku, крыніца
Э-э ... The AWK ... | тр ... | СЕПГ ... даволі ўражвае, але трохі бессэнсоўна. <�Код> Awk можа справіцца з гэтым.
дададзена аўтар TrueY, крыніца
$ cat test.txt
abc
def
ghi
jkl
mno

$ cat test.txt | tr '\n' ','
abc,def,ghi,jkl,mno,

$ cat test.txt | awk '{print "\x27" $1 "\x27"}' | tr '\n' ','
'abc','def','ghi','jkl','mno',

$ cat test.txt | awk '{print "\x27" $1 "\x27"}' | tr '\n' ',' | sed 's/,$//'
'abc','def','ghi','jkl','mno'

Апошняя каманда можа быць скарочана, каб пазбегнуць UUOC :

$ awk '{print "\x27" $1 "\x27"}' test.txt | tr '\n' ',' | sed 's/,$//'
'abc','def','ghi','jkl','mno'
3
дададзена
@miku я хачу выснову як 'ABC', 'ОПР', 'ГХИ', 'JKL', '' MnO
дададзена аўтар 122user321, крыніца
@miku дзякуй .....
дададзена аўтар 122user321, крыніца
Гэта, здаецца, адсутнічаюць каціроўкі, па-ранейшаму.
дададзена аўтар Jonathan Leffler, крыніца
І апошні СЕПГ 's /, $ //' ачышчае ...
дададзена аўтар Jonathan Leffler, крыніца
@miku - Некаторыя людзі не любяць файл кошка | other_command . Яны аддаюць перавагу other_command файл . +1 ўсё роўна.
дададзена аўтар mouviciel, крыніца
@PavanDongray: Мовы: Паведамленні двукоссі.
дададзена аўтар miku, крыніца
@mouviciel: Паведамленні нататка на UUOC, дзякуй.
дададзена аўтар miku, крыніца
@JonathanLeffler: Я люблю трубу.
дададзена аўтар miku, крыніца
Э-э ... The AWK ... | тр ... | СЕПГ ... даволі ўражвае, але трохі бессэнсоўна. <�Код> Awk можа справіцца з гэтым.
дададзена аўтар TrueY, крыніца

Выкарыстанне СЕПГ у адзіночку:

sed -n "/./{s/^\|\$/'/g;H}; \${x;s/\n//;s/\n/,/gp};" test.txt

Edit: Фіксаваны, ён павінен таксама працаваць з або без пустых радкоў у цяперашні час.

3
дададзена
@aragaer Ваша каманда працавала нармальна ...... дзякуй ...
дададзена аўтар 122user321, крыніца
+1 цяпер ён працуе.
дададзена аўтар Thor, крыніца
Гэта залежыць ад апошняй радкі на самай справе - калі апошняя радок дадзеных сканчаецца сімвалам новага радка яна будзе працаваць. У адваротным выпадку трэба памяняць месцамі два блокі кода і зрабіць яго s/^ \ | \ $/'/ г, H; \ $ {х, s/\ п //; s/\ п /,/ЗМ} замест гэтага.
дададзена аўтар aragaer, крыніца

Выкарыстанне СЕПГ у адзіночку:

sed -n "/./{s/^\|\$/'/g;H}; \${x;s/\n//;s/\n/,/gp};" test.txt

Edit: Фіксаваны, ён павінен таксама працаваць з або без пустых радкоў у цяперашні час.

3
дададзена
@aragaer Ваша каманда працавала нармальна ...... дзякуй ...
дададзена аўтар 122user321, крыніца
+1 цяпер ён працуе.
дададзена аўтар Thor, крыніца
Гэта залежыць ад апошняй радкі на самай справе - калі апошняя радок дадзеных сканчаецца сімвалам новага радка яна будзе працаваць. У адваротным выпадку трэба памяняць месцамі два блокі кода і зрабіць яго s/^ \ | \ $/'/ г, H; \ $ {х, s/\ п //; s/\ п /,/ЗМ} замест гэтага.
дададзена аўтар aragaer, крыніца

Выкарыстанне СЕПГ у адзіночку:

sed -n "/./{s/^\|\$/'/g;H}; \${x;s/\n//;s/\n/,/gp};" test.txt

Edit: Фіксаваны, ён павінен таксама працаваць з або без пустых радкоў у цяперашні час.

3
дададзена
@aragaer Ваша каманда працавала нармальна ...... дзякуй ...
дададзена аўтар 122user321, крыніца
+1 цяпер ён працуе.
дададзена аўтар Thor, крыніца
Гэта залежыць ад апошняй радкі на самай справе - калі апошняя радок дадзеных сканчаецца сімвалам новага радка яна будзе працаваць. У адваротным выпадку трэба памяняць месцамі два блокі кода і зрабіць яго s/^ \ | \ $/'/ г, H; \ $ {х, s/\ п //; s/\ п /,/ЗМ} замест гэтага.
дададзена аўтар aragaer, крыніца

Гэта можа быць зроблена вельмі коратка з SED і пасты:

Ці больш пераносным (я думаю, не магу праверыць прама цяпер):

sed "s/^\|\$/'/g" infile | paste -s -d , -
2
дададзена
ур каманда працавала выдатна пасля выдалення входной_файл з CMD г.зн. СЭД "s/^ \ | \ $/'/ г" <�я/P файл> | ўставіць -s -d, -
дададзена аўтар 122user321, крыніца
@PavanDongray: Я бачу, я пераехаў входной_файл , каб быць аргументам для СЭД ў партатыўнай версіі. <�Код> <�входной_файл абазначэння павінны працаваць з большасцю новых абалонак.
дададзена аўтар Thor, крыніца
$ cat file 
abc
def
ghi
jkl
mno

$ cat file | tr '\n' ' ' | awk -v q="'" -v OFS="','" '$1=$1 { print q $0 q }'
'abc','def','ghi','jkl','mno'
  1. Replace '\n' with ' ' -> (tr '\n\ ' ')
  2. Replace each separator (' ' space) with (',' quote-comma-quote) -> (-v OFS="','")
  3. Add quotes to the begin and end of line -> (print q $0 q)
2
дададзена
дзякуй за ур адказ ......
дададзена аўтар 122user321, крыніца
$ sed "s/[^ ][^ ]*/'&',/g" input.txt | tr -d '\n'
'abc','def','ghi','jkl','mno',

Для таго, каб ачысціць апошні , , кінуць у

| sed 's/,$//'
1
дададзена
дзякуй за ур адказ .......
дададзена аўтар 122user321, крыніца
awk 'seen == 1 { printf("'"','"'%s", $1);} seen == 0 {seen = 1; printf("'"'"'%s", $1);} END { printf("'"'"'\n"); }'

У крыху больш за чытаная фармаце (падыходзіць для AWK -f ):

# Print quote-terminator, separator, quote-start, thing
seen == 1 { printf("','%s", $1); }
# Set the "print separator" flag, print quote-start thing
seen == 0 { seen = 1; printf("'%s", $1}; }
END { printf("'\n"); } # Print quote-end
1
дададзена
Дзякуй за ур адказ ......
дададзена аўтар 122user321, крыніца
 perl -l54pe 's/.*/\x27$&\x27/' file
1
дададзена
 perl -l54pe 's/.*/\x27$&\x27/' file
1
дададзена