私のフォルダ(データ)にはテキストファイルがたくさん含まれています。各テキストファイルには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
れます。\t
TAB
を使用するか、ksh93
ファイルに拡張子があるか、パスコンポーネントにディレクトリのインクルードポイントがないとします。zsh
bash
paste_with_header() (
IFS=$'\t'
printf '%s\n' "${@%.*}"
paste -- "$@"
)
${@%.*}
.*
各位置引数の終わりに一致する最短の末尾部分を削除します(foo.txt
ただし、空の文字列になるfoo
ことに注意してください)。./foo
(これは明らかにファイル名にテーブルや改行文字が含まれていないと仮定します)。