1

実際のファイル データは次のとおりです。

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"}}'
4

8 に答える 8

4

sudo_O のコメントに応えてawk、純粋な bash に少ないソリューションを追加します。プログラムをまったく実行しません。もちろん、<<XXX ... XXX(ドキュメントはこちら) の代わりに を追加でき<filenameます。

set c=""
while read w; do
  echo -e "$c'$w'\c"
  c=,
done<<XXX
abc
def
ghi
jkl
mno
XXX

出力:

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

さらに短いバージョン:

printf -v out ",'%s'" $(<infile)
echo ${out:1}

恐ろしいパイプヘビなしで、次のようなことを試すことができます:

awk 'NR>1{printf ","}{printf "\x27%s\x27",$0}' <<XXX
abc
def
ghi
jkl
mno
XXX

出力:

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

または、入力全体を 1 行として読み取る別のバージョン:

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$0OFSORS

于 2013-05-22T08:20:44.980 に答える
3
$ 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'
于 2013-05-22T07:13:33.693 に答える
2

これは、sed と paste を使用して簡単に実行できます。

<infile sed "s/^\|\$/'/g" | paste -sd,

またはより移植性があります(私は思うに、今はテストできません):

sed "s/^\|\$/'/g" infile | paste -s -d , -
于 2013-05-22T09:25:35.263 に答える
2
$ 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. '\n' を ' ' に置き換えます -> (tr '\n\ ' ')
  2. 各セパレーター (' ' スペース) を (',' quote-comma-quote) に置き換えます -> (-v OFS="','")
  3. 行頭と行末に引用符を追加 -> (print q $0 q)
于 2013-05-22T07:36:39.977 に答える
1
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
于 2013-05-22T09:01:12.433 に答える
1
$ sed "s/[^ ][^ ]*/'&',/g" input.txt | tr -d '\n'
'abc','def','ghi','jkl','mno',

最後の をきれいにする,には、

| sed 's/,$//'
于 2013-05-22T08:35:11.443 に答える
1
 perl -l54pe 's/.*/\x27$&\x27/' file
于 2013-05-22T10:10:21.383 に答える