内部データに基づいて.datファイルを並べ替える

内部データに基づいて.datファイルを並べ替える

各ファイルには、2つの情報(重量と高さ、次のように区切られた空白)を含む多くの.datファイル(変数)があります。ここで First_Last は名前です。

18kg 1.2m「First1_Last1.dat」から

12kg 1.6m「First2_Last2.dat」などから

各値の最初または2番目の値に基づいてソートする必要があります。すべてのファイルをマージし(不明)、catセルを削除してから、ファイル名を一時ファイルの3番目の列として追加して目的の出力を取得する必要があると思います。各ファイルを正しい順序で開くには、関連付けられた名前が必要なので、各値がどのファイルから出てくるのかを追跡してください。だから私が使用したい出力ファイルは次のようになりますcutpastesort -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

関連情報