텍스트 파일에서 특정 정보를 검색해야 합니다.
Barnes and Kolling, 9780131976290,480, Pearson, Objects First with Java, LM002411,3989,781,true
Aho Sethi and Ullman, 9780201101942,795, Addison-Wesley, Compilers: Principles Techniques and Tools, LM002711,599,0,FALSE
Harvey Paul and Jeffrey, 9780130622211,1568, Prentice Hall, C# How to Program, LM002876,4599,45,TRUE
Muster, 9780072193145,1011, McGraw-Hill, Unix Made Easy: The Basics and Beyond (Made Easy), LM002468,6395,0,TRUE
Thomee, 9783540331216,370, Springer Verlag, Galerkin Finite Element Methods for Parabolic Problems, LM002153,4554,0,FALSE
검색할 정보:
자바 객체 먼저
컴파일러: 원리, 기술 및 도구
C# 프로그래밍 방법
Unix Made Easy: 기본 및 그 이상(Made Easy)
포물선 문제에 대한 Galerkin 유한 요소 방법
답변1
cut -d , -f 5 FILE
필요한 결과를 만들어낼 것입니다. 그러면 쉼표 구분 기호로 구분된 다섯 번째 열이 표시됩니다.
답변2
데이터 필드에 쉼표나 개행 문자가 포함되어 있지 않다고 가정할 때 가장 간단한 해결책은 를 사용하는 것입니다. cut -d , -f 5 file
이 경우 남겨질 초기 공백 문자를 제거하기 위해 약간의 후처리가 필요할 수 있습니다( sed 's/^[[:blank:]]*//'
이러한 공백 문자는 제거됩니다).
이 옵션을 이해하는 grep
비표준 변형이 없으면 데이터를 추출할 수 없습니다 . 기준만 일치 항목 추출grep
-o
grep
철사파일에서.
특정 필드를 일치시키기 위해 정규식을 사용하는 것은 지루하며 종종 특수 사례가 발견되자마자 중단되는 읽을 수 없는(따라서 유지 관리할 수 없는) 코드가 생성됩니다.
cut
이런 경우에는 위나 awk
(아래) 처럼 입력을 별도의 필드로 나눌 수 있는 방법을 아는 도구를 사용하는 것이 좋습니다 . 데이터가 실제로 CSV 파일인 것으로 밝혀지면 유틸리티를 조사해 볼 수 있습니다 csvkit
. CSV는 , 및 와 같은 간단한 도구를 처리하는 데 어려움을 겪는 특별한 csvcut
인용 및 인코딩 규칙이 있는 구조화된 형식이기 때문입니다 .grep
sed
awk
awk -F ',[[:blank:]]*' '{ print $5 }' file
이것정규 표현식 사용데이터의 구분 기호를 지정합니다(쉼표 뒤에 선택적 공백이 옴). 다섯 번째 필드가 추출되어 각 행에 인쇄됩니다.
이는 삽입된 쉼표(또는 개행)가 포함된 필드가 없다고 가정합니다.
문제에 입력이 주어지면 다음이 생성됩니다.
Objects First with Java
Compilers: Principles Techniques and Tools
C# How to Program
Unix Made Easy: The Basics and Beyond (Made Easy)
Galerkin Finite Element Methods for Parabolic Problems
다음과 같이 GNU를 사용할 수도 있습니다 sed
.
tr ',' '\n' <file | sed '5~9!d; s/^[[:blank:]]*//'
이는 모든 쉼표를 개행 문자로 바꾸고 5번째 줄부터 시작하여 9번째 줄마다 인쇄합니다(실제로는삭제이 줄 각각이 아니라 나머지 줄을 인쇄합니다). ㅏ정규 표현식 사용인쇄하기 전에 각 줄의 시작 부분에서 초기 공백을 제거하십시오.
재미로:
실제로 행당 9개의 필드로 구성된 중간 필드를 원하므로 첫 번째와 마지막 필드를 제거하고 더 이상 제거할 필드가 없을 때까지 이를 반복할 수 있습니다.
s/^[^,]*,//
in을 사용하여 시작 부분의 필드를 삭제할 수 sed
있고 in을 사용하여 끝 부분의 필드를 삭제할 수 있습니다 s/,[^,]*$//
. 가장 최근 명령이 변경된 경우 해당 명령은 t
지정된 레이블로 분기됩니다. 이 명령은 레이블을 도입합니다.sed
s///
:
$ sed -e ': again' -e 's/^[^,]*,//; s/,[^,]*$//' -e 't again' -e 's/^[[:blank:]]*//' file
Objects First with Java
Compilers: Principles Techniques and Tools
C# How to Program
Unix Made Easy: The Basics and Beyond (Made Easy)
Galerkin Finite Element Methods for Parabolic Problems
답변3
귀하의 제목 뒤에 가 있다고 가정합니다 LM...
. 다음은 귀하에게 적합한 정규식입니다.
sed "s/\([^,]*, *\)\{4\}\(.*\), LM.*/\2/" booksdata
데이터는 파일에 포함되어 있습니다 booksdata
. 정규식은 끝에 선택적 공백으로 구분된 \([^,]*, *\)\{4\}
4개의 필드 인스턴스를 캡처합니다 . ,
사용은 LM...
책 제목에 쉼표를 허용합니다.