유닉스에서 쉼표로 구분된 파일의 특정 위치에서 문자와 숫자를 제거하고 싶습니다.
내 데이터는 이렇습니다
jagan1,*,*,*,*,*,W,24,25,26
jagan2,*,*,*,*,*,1,24,25,26
jagan3,*,*,*,*,*,*,24,25,26
jagan4,*,*,*,*,*,P,24,25,26
jagan5,*,*,*,*,*,*,24,25,26
일곱 번째 위치에서는 *만 유지하고, 숫자나 문자가 있으면 줄 전체를 삭제하고 싶습니다.
다음과 같이 출력
jagan3,*,*,*,*,*,*,24,25,26
jagan5,*,*,*,*,*,*,24,25,26
답변1
간단하게awk
스크립트:
$ awk -F, '$7 == "*"' file.csv
jagan3,*,*,*,*,*,*,24,25,26
jagan5,*,*,*,*,*,*,24,25,26
-F,
-,
입력 필드 구분 기호로 (쉼표)를 설정합니다.'$7 == "*"'
- 7번째 필드가 다음과 같은 행만 고려합니다.*
지우는 것불필요한라인은 다음을 사용sed
방법:
$ sed -Ei '/^([^,]+,){6}[^*],/d' file.csv
답변2
그리고밀러, -I
파일을 제자리에서 편집할 수 있는 옵션 포함:
mlr -I --csv --implicit-csv-header --headerless-csv-output filter '$7 == "*"' file.csv
답변3
입력 파일이 있고 in.txt
일곱 번째 열에 별표가 있는 줄을 해당 파일에 복사하려면 out.txt
다음 grep 명령을 사용할 수 있습니다.
grep -E '^(([[:alnum:]]+|[*]),){6}\*' in.txt > out.txt
설명: 먼저 줄의 시작 부분( ^
)을 살펴본 다음 연속된 6개의 줄을 살펴보세요.영숫자 문자 또는 별표쉼표( (([[:alnum:]]+|[*]),)
; {6}
는 반복 횟수를 정의함)가 뒤따르고 다음 문자가 별표인지 확인합니다. 그렇다면 일치하는 행이 에 복사됩니다 out.txt
.
답변4
이번에는 다음을 시도해 보세요.
sed -i -Ee 's/^.*,[a-zA-Z0-9]*,[0-9]{2},[0-9]{2},[0-9]{2}$//' file && sed -i '/^$/d' file
형식이 지정된 문자열을 캡처 ...,<number or character>,<two numbers>,<two numbers>,<two numbers><end of line>
하고 삭제합니다.
빈 줄 삭제
'/^$/d'