Text-Processing

將以特殊字元開頭的行合併到新文件中

  • February 4, 2019

以下情況:我有大約 2000 個名為“dens_Run0_set0.#”的文件,其中 # 是某個數字,它們的填充方式如下

      1   0 1.000000e-01  6.3043370127282594e-01 -9.0687990423248266e-03  255 9.4509489123595358e-10 
      1   1 1.000000e-01  6.4071465952974904e-01  2.1357878278801461e-02  254 9.6824903650372107e-10 
      1   2 1.000000e-01  6.6258330124264830e-01 -8.3797056064819717e-03  255 9.5136742928048079e-10 
      1   3 1.000000e-01  6.2986715737376164e-01 -8.3306463914899122e-03  254 9.8325203534699313e-10 
      1   4 1.000000e-01  6.2984096793040101e-01 -2.2874605754168442e-03  255 9.7199825965788023e-10 
      1   5 1.000000e-01  6.3544494921916339e-01  4.0850692190967192e-04  255 9.3920704546945899e-10 
      1   6 1.000000e-01  6.1993535905745978e-01  1.6905867851164658e-03  255 9.2219992753328484e-10 
      1   7 1.000000e-01  6.6403589120818651e-01 -7.7065063672989709e-03  255 9.5683005962854395e-10 
      1   8 1.000000e-01  6.6151286798685760e-01  2.2987801390020952e-02  255 9.5036933878134278e-10 
      1   9 1.000000e-01  6.4426718104580993e-01 -9.1829913570412227e-03  255 9.5504193442508267e-10 
      6   0 1.000000e-01  4.0147426676412579e-02 -1.0968071205388696e-01  281 9.5556063062218755e-10 
      6   1 1.000000e-01  3.1792618041921133e-01  1.5324342699326129e-01  281 9.4066654465763122e-10 
      6   2 1.000000e-01  2.0570344663186310e-01 -5.7959543075412512e-02  281 9.4459629007559442e-10 
      6   3 1.000000e-01  1.4426831089076586e-01 -8.0085259971383493e-02  281 9.3488350394466124e-10 
      6   4 1.000000e-01  1.2697447761062600e-01 -7.9212954607404143e-02  281 9.4211360934792765e-10 
      6   5 1.000000e-01  9.4787370490545683e-02 -1.0902733768125472e-01  281 9.6087293677271646e-10 
      6   6 1.000000e-01 -3.6135020945645614e-02 -6.3683751812277478e-02  281 9.6366270518899455e-10 
      6   7 1.000000e-01  1.8645702206170731e-01 -1.1584221723023802e-01  281 9.7691299494329087e-10 
      6   8 1.000000e-01  3.4541099054452690e-01  5.8025780529230055e-02  281 9.4433605379862229e-10 
      6   9 1.000000e-01  2.6448819749081548e-01 -1.3873411819319395e-01  281 9.3928487210348521e-10 

現在我想將所有 2000 個文件的所有行,以“1”開頭的所有行合併到一個新文件中,並將所有以“6”開頭的行合併到一個不同的文件中。我怎樣才能做到這一點?

使用find和呼叫awk

find . -maxdepth 1 -type f -name 'dens_Run0_set0.*' \
   -exec awk '{ print >>$1 ".output" }' {} +

find命令將(僅)在目前目錄中查找名稱滿足給定模式的所有正常文件。對於這些文件的批次,awk將執行一個非常短的程序。

awk程序只是將找到的文件中的每一行輸出到名稱與第一個欄位中的數據類似1.output6.output取決於數據的新文件。

假設輸出文件不存在(或現有文件將被附加到)。進一步假設第一個欄位總是形成一個有效的安全文件名(沒有檢查來防止覆蓋文件系統中其他地方的現有文件)。

您是否想限製awk程序僅處理第一個欄位中恰好包含兩個數字 1 或 6 的行(以防您不想提取具有其他數字的其他行*)*,然後將awk程式碼更改為

$1 == 1 || $1 == 6 { print >>$1 ".output" }

根據您的系統,以下較短的命令也可能有效。如果沒有,由於文件太多,您會得到“參數列表太長”。

awk '{ print >$1 ".output" }' dens_Run0_set0.*

上面的find命令通過對一批文件(可能不是一次所有文件)執行awk多次來解決此錯誤。

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