
各ファイルには、2つの情報(重量と高さ、次のように区切られた空白)を含む多くの.datファイル(変数)があります。ここで First_Last は名前です。
18kg 1.2m
「First1_Last1.dat」から
12kg 1.6m
「First2_Last2.dat」などから
各値の最初または2番目の値に基づいてソートする必要があります。すべてのファイルをマージし(不明)、cat
セルを削除してから、ファイル名を一時ファイルの3番目の列として追加して目的の出力を取得する必要があると思います。各ファイルを正しい順序で開くには、関連付けられた名前が必要なので、各値がどのファイルから出てくるのかを追跡してください。だから私が使用したい出力ファイルは次のようになりますcut
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