次の点に関して助けが必要です。
A
B
C
1
2
Q
W
A
空の列が見つかるたびに、その列を新しい列に分割します。
出力:
A,1,Q
B,2,W
C,,A
Sedを使用しましたが、分割するキーワードが見つかりませんでした。データが多すぎて効率的に処理する方法はありませんか?
ありがとう
答え1
$ csplit -zsf file ip.txt /^$/+1 {*}
$ paste -d, file* | head -n -1
A,1,Q
B,2,W
C,,A
マニュアルから:
分割- ファイルをコンテキストラインによって決定された部分に分割する
-z, --elide-空のファイル空の出力ファイルの削除
-s, --quiet, --silent出力ファイルサイズの数を印刷しない
-f, --prefix=プレフィックス'xx'の代わりにPREFIXを使用してください。
生地- ファイルラインのマージ
-d, --delimiters=リストTABの代わりにLISTの文字を再利用する
head -n -1
最後の行を削除するには、次を使用することもできます。sed '$d'
答え2
$ cat tst.awk
BEGIN { RS=""; FS="\n"; OFS="," }
{
numRows = (NF>numRows ? NF : numRows)
numCols = colNr = NR
for (rowNr=1; rowNr<=NF; rowNr++) {
vals[rowNr,colNr] = $rowNr
}
}
END {
for (rowNr=1; rowNr<=numRows; rowNr++) {
for (colNr=1; colNr<=numCols; colNr++) {
printf "%s%s", vals[rowNr,colNr], (colNr<numCols ? OFS : ORS)
}
}
}
。
$ awk -f tst.awk file
A,1,Q
B,2,W
C,,A
上記はすべての入力をメモリに保存するため、YMMVは「巨大」の意味によって異なりますI have huge data
。入力のように、何百万もの空行で区切られたチャンクであれば問題ありませんが、テラバイト規模のデータであればそうです。動作しません。