Linuxで1行にファイルを分割してフォーマットする

Linuxで1行にファイルを分割してフォーマットする

次の問題の解決策を見つけるのに役立ちます。 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
  1. tr -s ' '複数の連続したスペースを1つに圧縮します。
  2. このawkコードは各入力行に改行を追加します。
  3. par 50p8h結果テキストを幅50文字(8文字の書き出しを含む)に設定します。
  4. これらのsed式は空の行を削除し、行の先頭の8つのスペースを単一のタブ文字に置き換えます。

GNUなしのソリューションの場合は、sed最後の式にリテラルタブ文字を挿入する必要があります。\tsed

インデントにスペースを使用し、スクリーンショット(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

追加j50p9h段落を正当化するのに有効です。

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回使用する必要があります。また、各元の行が数字で始まるという事実も活用します。

  1. tr -s ' '、以前と。
  2. awk '{ print $0, "\n" }'、以前と。
  3. fmt()への最初の呼び出しは、fmt -w 50各段落の最初の行を正しい幅(50文字)に調整します。
  4. スクリプトawkは、数字で始まらない行を9つのスペースでインデントします。
  5. 2番目fmtの呼び出しはテキスト全体の形式を50文字で指定しますが、今インデントされた行はインデントされたままです。
  6. このsed式は空行を削除します。

おすすめ記事