次の問題の解決策を見つけるのに役立ちます。 Linuxでは、次の例の.txtファイルの出力を提供する1行のコマンドを作成しようとしています(添付の図)。
入力 - 例.txt
11430.00 SH: gry to dk gry, firm to mod hd, plty, flk, ea to gt, abd LCM; SLTST: gry, sft to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty, flk, ea to gt, abd LCM; SLTST: gry, sft to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy; SH: gry to dk gry, firm to mod hd, plty, occ blky, ea to gt; SLTST: gry to dk gry, mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty, blky, ea to gt, tr MRL, occ LCM; SLTST: gry, occ brnsh rd, firm, amor to blky, ea to g
使用しましたが、fmt -w 50 -u Example.txt > FMT_Output.txt
目的の出力が出ませんでした。数字で始まる行を除くすべての行にスペース/タブを追加する必要があります(「必須出力」の下に表示されます)。また、コマンドを試してみましたが、sed 's/^/ /
これはマルチステッププロセスであり、コマンドも目的の出力を提供できませんでした。これをワンステッププロセスで実行する方法があるかどうかを教えてください。
残念ながら、フォーマットされたファイルをロードしようとすると機能しません。ファイルを読み込むと、システムは番号を最初の列として認識し、テキストを2番目の列として認識する必要があります。ただし、書式設定された最初の行全体は最初の列に入り、残りのテキストは2番目の列に入ります。列見出しに基づいて書式を設定する方法を考えることができますか?新しい写真を見てください。
DEEP 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
ベストアンサー1
テキストフォーマッタpar
(およびGNU sed
)(par
回避策ではない場合は最後を参照):
$ tr -s ' ' <file.in | awk '{ print $0, "\n" }' | par 50p8h | sed -r -e '/^$/d' -e 's/^ {8}/\t/'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft to
firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft to
firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
SH: gry to dk gry, firm to mod hd, plty,
occ blky, ea to gt; SLTST: gry to dk gry,
mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
blky, ea to gt, tr MRL, occ LCM; SLTST:
gry, occ brnsh rd, firm, amor to blky, ea
to g
tr -s ' '
複数の連続したスペースを1つに圧縮します。- この
awk
コードは各入力行に改行を追加します。 par 50p8h
結果テキストを幅50文字(8文字の書き出しを含む)に設定します。- これらの
sed
式は空の行を削除し、行の先頭の8つのスペースを単一のタブ文字に置き換えます。
GNUなしのソリューションの場合は、sed
最後の式にリテラルタブ文字を挿入する必要があります。\t
sed
インデントにスペースを使用し、スクリーンショット(9スペース)と同じように左インデントを使用するソリューションの場合:
$ tr -s ' ' <file | awk '{ print $0, "\n" }' | par 50p9h | sed -e '/^$/d'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
SH: gry to dk gry, firm to mod hd, plty,
occ blky, ea to gt; SLTST: gry to dk gry,
mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
blky, ea to gt, tr MRL, occ LCM; SLTST:
gry, occ brnsh rd, firm, amor to blky, ea
to g
追加j
は50p9h
段落を正当化するのに有効です。
11430.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
SH: gry to dk gry, firm to mod hd, plty,
occ blky, ea to gt; SLTST: gry to dk gry,
mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
blky, ea to gt, tr MRL, occ LCM; SLTST:
gry, occ brnsh rd, firm, amor to blky, ea
to g
...そしてl
これを追加すると、各段落の最後の行のサイズが調整されます(あまり良くありません)。
11430.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry,
sft to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry,
sft to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
SH: gry to dk gry, firm to mod hd, plty,
occ blky, ea to gt; SLTST: gry to dk
gry, mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod
hd, plty, blky, ea to gt, tr MRL,
occ LCM; SLTST: gry, occ brnsh
rd, firm, amor to blky, ea to g
par
ほとんどのUnicesのほとんどのパッケージマネージャで使用できますが、次の場所でソースコードを見つけることもできます(直接コンパイルする場合)。http://www.nicemice.net/par/
解決策はfmt
代わりに使用することです。par
$ tr -s ' ' <file.in | awk '{ print $0, "\n" }' | fmt -w 50 |
awk '/^[^0-9]/ { $0 = " " $0 }
{ print }' | fmt -w 50 | sed '/^$/d'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
SH: gry to dk gry, firm to mod hd, plty,
occ blky, ea to gt; SLTST: gry to dk gry,
mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
blky, ea to gt, tr MRL, occ LCM; SLTST:
gry, occ brnsh rd, firm, amor to blky, ea
to g
fmt
その形式は柔軟性が低いため、ここでは期待した結果を得るために2回使用する必要があります。また、各元の行が数字で始まるという事実も活用します。
tr -s ' '
、以前と。awk '{ print $0, "\n" }'
、以前と。fmt
()への最初の呼び出しは、fmt -w 50
各段落の最初の行を正しい幅(50文字)に調整します。- スクリプト
awk
は、数字で始まらない行を9つのスペースでインデントします。 - 2番目
fmt
の呼び出しはテキスト全体の形式を50文字で指定しますが、今インデントされた行はインデントされたままです。 - この
sed
式は空行を削除します。