Text-Processing

從命令“粘貼”的輸出創建表頭

  • March 27, 2018

我的文件夾(數據)包含大量文本文件。每個文本文件包含一列數字,該列包含 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  .....
......

此命令將所有列組合在一個大電子表格中。我的問題:有沒有辦法粘貼文本文件中的每一列並將文本文件名標題添加到該列。如下:

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  .....
......

你可以做:

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

或者使用ksh93zsh或者bash假設文件確實有副檔名,或者它們的路徑組件中沒有目錄包含點:

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

${@%.*}刪除與.*每個位置參數末尾匹配的最短尾隨部分(foo.txt變成foo,但要注意./foo變成空字元串)。

(那些顯然假設文件名不包含製表符或換行符)。

引用自:https://unix.stackexchange.com/questions/433866