내부 데이터를 기준으로 .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

관련 정보