私は、データをMySQLデータベースに保存するために必要な基本を繰り返すためにsed(約4回)を使用する大きな非標準のxhtmlファイルを持っています。私の最後の小さな闘争。このファイルの形式は次のとおりです。
Tue Aug 18 2015
0,0,0,0,0
0,0,0,2,275
0,0,0,3,287
0,0,0,0,327
0,0,0,3,335
0,0,0,0,413
Wed Aug 19 2015
0,0,0,0,0
0,0,0,2,275
0,0,0,3,287
0,0,0,2,308
Thu Aug 20 2015
0,0,0,0,0
0,0,0,2,458
0,0,0,3,469
0,0,0,0,472
0,0,0,3,503
0,0,0,2,534
この日の前には常に空白があります。日付の後にCSV値の行が複数ある場合があります。
私が達成したいことは次のとおりです。
Tue Aug 18 2015,0,0,0,0,0
Tue Aug 18 2015,0,0,0,2,275
Tue Aug 18 2015,0,0,0,3,287
Tue Aug 18 2015,0,0,0,0,327
Tue Aug 18 2015,0,0,0,3,335
Tue Aug 18 2015,0,0,0,0,413
Wed Aug 19 2015,0,0,0,0,0
Wed Aug 19 2015,0,0,0,2,275
Wed Aug 19 2015,0,0,0,3,287
Wed Aug 19 2015,0,0,0,2,308
Thu Aug 20 2015,0,0,0,0,0
Thu Aug 20 2015,0,0,0,2,458
Thu Aug 20 2015,0,0,0,3,469
Thu Aug 20 2015,0,0,0,0,472
Thu Aug 20 2015,0,0,0,3,503
Thu Aug 20 2015,0,0,0,2,534
可能であれば、日付を削除してカンマを追加して、PHPスクリプトでより簡単に操作できるようにします。たとえば、次のようになります。
Aug,18,2015,0,0,0,0,0
Aug,18,2015,0,0,0,2,275
Aug,18,2015,0,0,0,3,287
Aug,18,2015,0,0,0,0,327
Aug,18,2015,0,0,0,3,335
Aug,18,2015,0,0,0,0,413
Aug,19,2015,0,0,0,0,0
Aug,19,2015,0,0,0,2,275
Aug,19,2015,0,0,0,3,287
Aug,19,2015,0,0,0,2,308
Aug,20,2015,0,0,0,0,0
Aug,20,2015,0,0,0,2,458
Aug,20,2015,0,0,0,3,469
Aug,20,2015,0,0,0,0,472
Aug,20,2015,0,0,0,3,503
Aug,20,2015,0,0,0,2,534
使用できるコマンドはありますか?
答え1
1つの方法は次のとおりです。
sed '/,/!{ # if there's no comma on this line
y/ /,/ # translate spaces to commas
h # copy pattern space over the hold buffer
d # delete pattern space
}
//{ # if the line contains commas
G # append hold space content to pattern space
s/\(.*\)\n,[^,]*,\(.*\)/\2,\1/ # swap lines removing newline, the day part and
} # first two commas and adding a comma after year
' infile
gnu sed
1行を好む場合:
sed -E '/,/!{y/ /,/;h;d};//{G;s/(.*)\n,[^,]*,(.*)/\2,\1/}' infile
次のようになりますawk
。
行にカンマが含まれていない場合は、日付形式を指定してsprintf
結果を変数(たとえば)に保存してから、dt
ログnext
に移動して実行できます。それ以外の場合は、単に追加してくださいdt
($0
つまり、現在の行):
awk '!/,/{dt=sprintf("%s,%s,%s,", $2, $3, $4);next};$0=dt$0' infile
答え2
awk -F, -v OFS=, '/^[[:blank:]]+/ {
str=gensub(/ /,",","g",$0);
sub(/^,+[^,]+,/,"",str);
next
};
!/^[[:blank:]]+/ {print str,$0}' nick.txt
(もちろん、1行にすべて書くこともできます。1行で書いてテストし、ここでより読みやすくするために改行とインデントを追加しました。)
1つまたは空白文字(スペースやタブなど)で始まる行の場合、このスクリプトはすべての空白をコンマに変換し、変更された行をawk
変数という変数に保存し、最初のカンマと行を含むすべてのstr
テキストを削除します。 。
空白文字で始まらない行の場合は、現在の値が前に付いた行を印刷しますstr
。
警告:CSVデータ行がある場合今後最初の日付行、この行は接頭辞として単一のコンマのみを使用して印刷されます。
出力:
Aug,18,2015,0,0,0,0,0
Aug,18,2015,0,0,0,2,275
Aug,18,2015,0,0,0,3,287
Aug,18,2015,0,0,0,0,327
Aug,18,2015,0,0,0,3,335
Aug,18,2015,0,0,0,0,413
Aug,19,2015,0,0,0,0,0
Aug,19,2015,0,0,0,2,275
Aug,19,2015,0,0,0,3,287
Aug,19,2015,0,0,0,2,308
Aug,20,2015,0,0,0,0,0
Aug,20,2015,0,0,0,2,458
Aug,20,2015,0,0,0,3,469
Aug,20,2015,0,0,0,0,472
Aug,20,2015,0,0,0,3,503
Aug,20,2015,0,0,0,2,534