"paste"コマンドの出力からヘッダーを生成する

私のフォルダ(データ)にはテキストファイルがたくさん含まれています。各テキストファイルには30個の数値列が含まれています。このテキストファイルの列を結合するテーブルを作成したいと思います。次のコマンドを使用しました。

  cd data
  paste *.txt > all_data.txt

出力は次のとおりです。

0.834679    0.612341    0.510057    0.580128  .....
1.837894    1.061547    0.961449    1.343096  .....
1.638215    1.024628    1.113596    1.80506  .....
1.596119    0.971842    1.14204     1.73881  .....
1.568142    1.025716    1.217219    1.769668  .....
1.554016    0.977165    1.226769    1.786335  .....
1.543137    1.001812    1.247598    1.840443  .....
1.491823    0.99437     1.28337     1.784271  .....
1.371208    0.931998    1.259749    1.717408  .....
1.390867    0.905996    1.300722    1.739213  .....
1.35813     0.283377    1.307122    1.733058  .....
......

このコマンドは、すべての列を1つの大きなスプレッドシートにマージします。私の質問:各列をテキストファイルに貼り付け、その列にテキストファイル名ヘッダーを追加する方法はありますか?次のように:

text_file1  text_file2  text_file3  text_file4 ....  
0.834679    0.612341    0.510057    0.580128  .....
1.837894    1.061547    0.961449    1.343096  .....
1.638215    1.024628    1.113596    1.80506  .....
1.596119    0.971842    1.14204     1.73881  .....
1.568142    1.025716    1.217219    1.769668  .....
1.554016    0.977165    1.226769    1.786335  .....
1.543137    1.001812    1.247598    1.840443  .....
1.491823    0.99437     1.28337     1.784271  .....
1.371208    0.931998    1.259749    1.717408  .....
1.390867    0.905996    1.300722    1.739213  .....
1.35813     0.283377    1.307122    1.733058  .....
......

ベストアンサー1

あなたはできます:

paste_with_header() (
  IFS=$(printf '\t') # or IFS=$'\t' with some shells
  printf '%s\n' "$*"
  paste -- "$@"
)

paste_with_header text_file* > all_data.txt

"$*"$IFSで設定した最初の文字に関連付けられている位置引数(関数の引数)のリストを展開します。TABこれはpasteファイルの行をリンクするためにも使用されます。

ヘッダーからファイル拡張子を削除するには、次のようにしますzsh

paste_with_header() (
  printf '%s\n' ${(pj:\t:)@:r}
  paste -- "$@"
)
  • ${@:r}各位置引数のルート名に展開されます(拡張子の削除)。
  • j:\t:追加するパラメータ拡張フラグです\t。これは次のように解釈さpれます。\tTAB

を使用するか、ksh93ファイルに拡張子があるか、パスコンポーネントにディレクトリのインクルードポイントがないとします。zshbash

paste_with_header() (
  IFS=$'\t'
  printf '%s\n' "${@%.*}"
  paste -- "$@"
)

${@%.*}.*各位置引数の終わりに一致する最短の末尾部分を削除します(foo.txtただし、空の文字列になるfooことに注意してください)。./foo

(これは明らかにファイル名にテーブルや改行文字が含まれていないと仮定します)。

おすすめ記事