私のシステムにインポートする必要があるファイルのデータ型を指定しようとしています。このシステムでは、テキストの1行の長さは65文字を超えません。そこで、以下の例のように説明列のテキストを複数行にフォーマットしてみました。 1行のLinuxコマンドであれば、ユーザーにとって本当に役に立ちます。動作していることを確認できますか?
ファイルからの入力例 -
深さの説明 (足)- 12370.0 LS: Mdst, blsh gry, sft, occ modfirm, crpxln, prly, arg, SLTST: blk, Firm-mod hd, amor, gt, mod calc, CLST: lt gry-m gry, sft, amor, wxy 12400.0 LS: Mdst, blsh gry, modfirm, crpxln, chky, arg, SLTST: blk-dk gry, Firm-mod hd, amor, gt, mod calc, CLST: lt gry-m gry, occ rdsh gry, modfirm, love 、wxy、tr CHK 12430.0 LS: Mdst, blsh gry, modfirm, crpxln, chky, arg, SLTST: blk-dk gry, Firm-mod hd, amor, gt, mod calc, SH: blk-dk gry, modfirm, blky-plty, OCCUK人々,wxy 12460.0 SH: blk-dk gry, modfirm, blky-plty, occ brit, ea, SLTST: blk-dk gry, Firm-mod hd, amor, gt, mod calc, SST: gry-dk gry, wl consol, vf, ang, p srt, cotd, slily calc cmt, フッ素
深さと説明とその下の行はタイトルと見なされます。 Depth列にはすべての数値が含まれ、Description列にはシステムがデータを受け入れるために複数行にフォーマットする必要があるテキストが含まれています。
Linuxコマンドで希望の出力 -
深さの説明 (足)- 12370.0 LS: Mdst, blsh gry, sft, occ modfirm, crpxln, prly, arg, SLTST: blk, 会社モード hd, amor, gt, mod calc, CLST: lt gry-m gry, sft, 愛,wxy 12400.0 LS:Mdst、blsh gry、modfirm、crpxln、chky、 arg, SLTST: blk-dk gry, Firm-mod hd, 愛, gt, mod calc, CLST: lt gry-m gry, occ rdsh gry, モードロバスト、愛、wxy、tr CHK 12430.0 LS:Mdst、blsh gry、modfirm、crpxln、chky、 arg, SLTST: blk-dk gry, Firm-mod hd, 愛, gt、mod calc、SH:blk-dk gry、modfirm、 blky-plty, OCC UK, wxy 12460.0 SH: blk-dk gry, modfirm, blky-plty, occ Brit, ea, SLTST: blk-dk gry, Firm-mod hd, amor, gt, モード計算、SST: gry-dk gry, wl consol, vf, ang, p srt, cotd, 滑りやすい石灰質 cmt, フッ素
注 – ユーザーは自分のコンピュータに Linux パッケージをインストールできません。 (例 - 波)
答え1
標準awk
:
{ printf("%s\t", $1) }
{
linelen = 8; # assume 8 spaces for the first field
for (i = 2; i <= NF; ++i) {
wordlen = length($i);
if (wordlen + linelen > 65) {
# break output line since adding next word
# would make it too long
printf("\n\t");
linelen = 8; # count tab as 8 spaces
}
if (i < NF) {
printf("%s ", $i);
linelen += wordlen + 1; # +1 for the space
} else {
printf("%s\n", $i);
}
}
}
テスト:
$ awk -f script.awk file.in
Depth Description
(ft) -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly, arg,
SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST: lt
gry-m gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST: lt
gry-m gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, SH: blk-dk
gry, mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, SST: gry-dk
gry, wl consol, v f, ang, p srt, cotd, slily calc cmt, no
fluor
唯一の欠点は、ほとんどの出力ラインに末尾の空白が残ることです。出力を渡してそれを削除できますsed 's/ $//'
。
答え2
GNUの使用sed
:
$ sed -r '3,$s/(.{55} )/\1\n\t/g' file.in
Depth Description
(ft) -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly,
arg, SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST:
lt gry-m gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg,
SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST:
lt gry-m gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg,
SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, SH:
blk-dk gry, mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea,
SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, SST:
gry-dk gry, wl consol, v f, ang, p srt, cotd, slily calc
cmt, no fluor
これにより、行の末尾にスペースが残ります。このスペースはthisを実行して削除できますsed 's/ $//'
。
この式は、3,$s/(.{55} )/\1\n\t/g
55文字をすべて同じ55文字(およびスペース)、スペース、改行、およびタブのインデントに置き換えます。その行のすべてのパターン一致に対してこの操作が繰り返されます。
答え3
アッ解決策:
awk 'NR<=2{ print }NR>2{ c=0; r=$1;
for(i=2;i<=NF;i++) {
if ((length(r) + length($i)) > (!c? 65:61)) { c++; printf "%s\n\t",r; r=$i }
else { r=r FS $i } if(i==NF) printf "%s",r }
print ""
}' file
NR<=2{ print }
- 最初の2行をそのまま印刷します。r
処理/フォーマットされた各行を含む変数
出力:
Depth Description
(ft) -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly, arg,
SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST: lt gry-m
gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST: lt gry-m
gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, SH: blk-dk gry,
mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea, SLTST:
blk-dk gry, firm-mod hd, amor, gt, mod calc, SST: gry-dk gry,
wl consol, v f, ang, p srt, cotd, slily calc cmt, no fluor