CSV 파일을 정렬할 때 예기치 않은 결과가 발생함

CSV 파일을 정렬할 때 예기치 않은 결과가 발생함

아래와 같이 4개의 열이 있는 CSV 파일이 있고 bash 터미널에서 파일 이름을 입력합니다.

Sile,Barhams,Female,[email protected]
Shae,Scotti,Male,[email protected]
Shae,Bonham,Female,[email protected]
Shay,Ert,Female,[email protected]
Simeon,Dearle,Male,[email protected]

원하는 출력은 다음과 같습니다.

Shae,Male
Shae,Female
Shay,Female
Sile,Female
Simeon,Male

이제 다음 코드 조각을 시도하여 다음과 같은 결과를 얻었습니다.

cat $file | cut -d, -f1,3 | sort -k 1,1 -s

Shae,Female
Shae,Male
Shay,Female
Sile,Female
Simeon,Male

cat $file  | cut -d, -f1,3 | sort -k 1,1 -s -n

Sile,Female
Shae,Male
Shae,Female
Shay,Female
Simeon,Male

누군가 내 두 조각을 설명하고 원하는 조각을 얻는 방법을 설명할 수 있습니까? 나에 따르면 첫 번째 열을 기준으로 정렬하는 첫 번째 코드가 있고 동률이 있는 경우 원하는 출력을 얻기 위해 안정적인 정렬을 지정했지만 문제가 무엇인지 모르겠습니다. 두 번째 코드에서 알고 싶습니다. "Sile"이 상단에 어떻게 나타나는지.

답변1

cat $file | cut -d, -f1,3 | sort -k 1,1 -s

Shae,Female
Shae,Male
Shay,Female
Sile,Female
Simeon,Male

-k필드가 다음을 참조하기 때문에 아이디어를 얻을 수 있습니다.공백이 분리됨기본적으로 필드는 Shae,Female앞에 정렬 됩니다 Shae,Male.

-t쉼표를 구분 기호로 사용하도록 지시하는 옵션이 필요합니다 .

-t, --field-separator=SEP
공백이 아닌 공백 대신 SEP를 공백으로 전환하는 데 사용

$ cat "$file"  | cut -d, -f1,3 | sort -t, -k 1,1 -s
Shae,Male
Shae,Female
Shay,Female
Sile,Female
Simeon,Male

cat $file  | cut -d, -f1,3 | sort -k 1,1 -s -n

Sile,Female
Shae,Male
Shae,Female
Shay,Female
Simeon,Male

여기서 의 경우 -n데이터의 수치를 기준으로 정렬됩니다. 그러나 여기에는 숫자 문자열이 없습니다. 숫자가 아닌 모든 문자열은 0으로 처리됩니다. 따라서 실제로 기본 순서 규칙이 없습니다. 사용하면 -s순서가 그대로 유지됩니다. 그렇지 않은 경우 -s텍스트 sort정렬로 돌아가서 가져옵니다.일부결과.

답변2

이상한. 이 데이터에 파이프라인을 적용하면 다음과 같은 결과를 얻습니다.

Sile
Shae
Shae
Shay
Simeon

파이프라인을 자세히 살펴보겠습니다.

cat filename | grep "^.\{0\}S" | cut -d, -f1,6 | sort -s -n -k1,1

먼저 다음과 같이 단순화합니다.

grep "^S" filename | cut -d, -f1,6 | sort -s -n -k1,1

고양이를 원하지 않으며(때때로 "고양이 학대"라고도 함) 정규식에서는 줄 시작 뒤에 문자가 0개이고 그 뒤에 S가 와야 합니다. 이는 S로 시작하는 줄과 동일합니다.

필드가 두 개뿐인데 왜 필드 1과 6이 제거됩니까? 그리고 나는 그 결과가 두 번째 필드를 보존할 것이라고 믿지 않습니다. 뭔가 이상하지만 이상한 점은 무시합시다 cut.

숫자 정렬을 수행합니다. 파일에 지정된 번호가 없으므로 -s순서는 변경되지 않습니다. 삭제 -n및/또는 -s.

관련 정보