아래와 같이 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
.