내부 데이터를 기준으로 .dat 파일 정렬

내부 데이터를 기준으로 .dat 파일 정렬

각 파일에 2개의 정보(무게와 높이, 다음과 같이 구분된 공백)가 포함된 많은 .dat 파일(변수)이 있습니다. 여기서 First_Last는 이름입니다.

18kg 1.2m"First1_Last1.dat"에서

12kg 1.6m"First2_Last2.dat" 등에서

각 값의 첫 번째 또는 두 번째 값을 기준으로 정렬해야 합니다. 모든 파일을 병합하고 (확실하지 않음) cat셀을 제거한 다음 파일 이름을 임시 파일의 세 번째 열로 추가하여 원하는 출력을 얻어야 한다고 생각합니다. 각 파일을 올바른 순서로 열려면 연결된 이름이 필요하므로 각 값이 어떤 파일에서 나오는지 추적하세요. 그래서 내가 사용하고 싶은 출력 파일은 다음과 같습니다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

파일에 각각 하나의 데이터(행)만 포함되어 있는 경우 다음과 같이 간단하게 작동할 수 있습니다.

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

관련 정보