
我有許多 .dat 檔案(變數),每個檔案中有 2 個訊息,一個重量和一個高度,空格分隔如下,其中 First_Last 是名稱:
18kg 1.2m
在“First1_Last1.dat”中
12kg 1.6m
在“First2_Last2.dat”等。
我需要按每個值中的第一個或第二個值對它們進行排序。我想我必須cat
合併所有文件,用 a 去掉單元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
如果您的文件每個僅包含一個資料(行),那麼像這樣簡單的事情可能會起作用:
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 sort 進行了快速測試,並沒有真正看到單位或小數出現問題,但我不做任何保證。
答案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