
.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