NFおよびforループを使用してスクリプトを最適化する方法

NFおよびforループを使用してスクリプトを最適化する方法

複数のファイルがあり、それぞれの列数が異なります。データベースに挿入するために変換したいです。

たとえば、ファイルtest01は次のようになります。

0001    000000000000001 john smith  45  500
0002    000000000000002 peter jackson   20  80
0003    000000000000002 robert brown    35  100
0004    000000000000007 sarah white 40  300

私が望む出力は次のとおりです。

('0001','000000000000001','john smith','45','500'),
('0002','000000000000002','peter jackson','20','80'),
('0003','000000000000002','robert brown','35','100'),
('0004','000000000000007','sarah white','40','300');

これを達成するには、次のスクリプトを使用します。

cat test01 |awk -F'\t' '{print "('\''"$1"'\'','\''"$2"'\'','\''"$3"'\'','\''"$4"'\'','\''"$5"'\''),"}' |sed '$ s/.$/;/' 

うまくいきます。問題は、異なる列数の異なるファイルを見つけると発生するため、スクリプトを手動で変更する必要があります。

AWKの変数NFを使用して列数を取得できることはわかっていますが、スクリプトでこの変数をforループとどのように結合しますか?

私が試したとき

cat test01 | awk '{for (i = 1; i <= NF; i++){print $i"'\'','\''"}}'

私は次のような結果を得ます。

0001','
000000000000001','
john','
smith','
45','
500','
0002','
000000000000002','
peter','
jackson','
20','
80','
0003','
000000000000002','
robert','
brown','
35','
100','
0004','
000000000000007','
sarah','
white','
40','
300','

ベストアンサー1

入力ファイルがタブで区切られている場合は、次のことを試すことができます。

awk -F"\t" -v q="'" -v OFS="','" '$1=$1 {print "(" q $0 q ");"}' filename

または、印刷機能に引用符を挿入してください。

awk -F"\t" -v OFS="','" '$1=$1 {print "(" "\x27" $0 "\x27" ");"}' filename

おすすめ記事