依內部資料對 .dat 檔案進行排序

依內部資料對 .dat 檔案進行排序

我有許多 .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

您可以使用grepsed提取排序鍵並僅指定某些列進行排序:

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設定要排序的列(12);或作為單行

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

相關內容