.dat ファイルを内部データでソートする

.dat ファイルを内部データでソートする

.dat ファイル (変数) がいくつかあり、それぞれに体重と身長の 2 つの情報 (First_Last が名前) が次のようにスペースで区切られて含まれています。

18kg 1.2m「First1_Last1.dat」内

12kg 1.6m「First2_Last2.dat」など

それぞれの最初の値または 2 番目の値で並べ替える必要があります。catすべてのファイルを結合し、単位を で取り除きcut(よくわかりません)、ファイル名を 3 番目の列として追加しpaste、最後にsort -k 1,1 temp.txt一時ファイルに を追加して、各値がどのファイルから来たのかを追跡しながら、目的の出力を得る必要があると思います。これは、後で各人の異なるファイルを正しい順序で開くために、関連付けられた名前が必要になるためです。したがって、使用する出力ファイルは次のようになります。

12 1.6 First2_Last2.dat
18 1.2 First1_Last1.dat

組み込みのものや、私が見逃している .dat ファイル タイプのプロパティを使用してこれを行うより良い方法があるかどうか疑問に思っています。または、 を使用することもできますかawk?

答え1

grepおよび を使用してsedソート キーを抽出し、ソートする特定の列のみを指定できます。

grep -H kg *.dat \
  | sed 's/^\([^:]\+\):\([0-9.]\+\)kg \+\([0-9.]\+\)m.*$/\2 \3 \1/' \
  | sort -t' ' -k1,2 -g

出力例:

12 1.6 First2_Last2.dat
18 1.2 First1_Last1.dat

答え2

ファイルにそれぞれ 1 つのデータ (行) しか含まれていない場合は、次のような簡単な方法でうまくいく可能性があります。

for x in *.dat ; do     
    echo $(< "$x") $x    # print contents of file and add the filename 
done  |  sort -nsk2,2    # stable sort by the second column.

GNU ソートで簡単にテストしましたが、単位や小数点が問題を引き起こすことは実際には確認されませんでしたが、保証はできません。

答え3

おそらく、GNU awk (の最新バージョン) を使用します - 「.dat ファイル」は空白で区切られたテキスト ファイルを意味するものとします。

awk -v sort=2 '
  {
    gsub(/kg|m/,"",$0);
    a[$sort]=$0 FS FILENAME;
  }
  END {
    PROCINFO["sorted_in"]="@ind_num_asc";
    for (i in a) print a[i];
  }' *.dat

ここで変数はsortソートする列を設定します(1または2)。またはワンライナーとして

awk -v sort=1 '{gsub(/kg|m/,"",$0); a[$sort]=$0 FS FILENAME}; END{PROCINFO["sorted_in"]="@ind_num_asc"; for (i in a) print a[i]}' *.dat

テスト

$ awk -v sort=1 '{gsub(/kg|m/,"",$0); a[$sort]=$0 FS FILENAME}; END{PROCINFO["sorted_in"]="@ind_num_asc"; for (i in a) print a[i]}' *.dat
12 1.6 First2_Last2.dat
18 1.2 First1_Last1.dat

そして

$ awk -v sort=2 '{gsub(/kg|m/,"",$0); a[$sort]=$0 FS FILENAME}; END{PROCINFO["sorted_in"]="@ind_num_asc"; for (i in a) print a[i]}' *.dat
18 1.2 First1_Last1.dat
12 1.6 First2_Last2.dat

関連情報