텍스트 파일의 이름을 기반으로 특정 데이터만 가져오기

텍스트 파일의 이름을 기반으로 특정 데이터만 가져오기

내 텍스트 파일에 다음이 포함되어 있다고 가정해 보겠습니다.

101    Adam
201    Clarie
502    Adam
403    Tom

특정 이름에 따라 숫자만 제공하는 명령을 쉘에 작성하고 싶습니다. 예를 들어 "Adam"이라는 이름의 숫자만 출력하면 다음과 같습니다.

101
502

나는 다음과 같은 것을 생각하고 있습니다 :

cut -f 1 Data_1 | grep "Adam"

하지만 작동하지 않습니다. Data_1은 파일 이름입니다. 1은 첫 번째 열을 나타냅니다. 저는 Unix를 처음 접했기 때문에 이에 대한 피드백을 주시면 감사하겠습니다.

답변1

grep다음 옵션을 통해 Perl 둘러보기 확장과 함께 Single을 사용할 수 있습니다 -P.

grep -Po '.*(?=Adam)' file

그러면 Adam이라는 단어까지 한 줄에 있는 모든 내용이 인쇄됩니다.

공백 등을 제외하고 숫자만 원하는 경우 다음을 수행하세요.

grep -Po '[0-9]*(?=.*Adam)' file

답변2

awk이에 권장

  • 기본 입력 필드 구분 기호는 하나 이상의 연속 공백이므로 공백/탭 구분에 대해 걱정할 필요가 없습니다.
  • 고정 문자열을 비교하기가 더 쉽습니다(예: 정규식 메타 문자에 덜 취약함 - 따옴표 및 백슬래시 문자를 사용하여 문자열을 구성할 때 주의해야 함).이스케이프 시퀀스)


$ cat ip.txt
101    Adam
201    Clarie
502    Adam
403    Tom

$ # check if 2nd column value is Adam (wont match MAdam, Adama, etc)
$ # use $NF instead of $2 to check against last column
$ awk '$2=="Adam"{print $1}' ip.txt
101
502

$ # using variable instead of string constant
$ awk -v name='Adam' '$2==name{print $1}' ip.txt
101
502

$ # passing shell variable
$ n='Tom'
$ awk -v name="$n" '$2==name{print $1}' ip.txt
403

답변3

먼저 grep/cut을 역순으로 수행합니다. 그리고 이것이 열을 구분하는 실제 탭 문자(예: Tab알 수 없음)가 아닌 한 일반 공백(예: )을 구분 기호로 지정해야 합니다 Space.

grep Adam Data_1 | cut -f1 -d' '

탭을 사용하는 경우에는 사용하지 마세요 -d' '.

일반적으로 이와 같은 복합 명령을 작성할 때는 한 번에 하나씩 시도해 보십시오. 혼자 뭔가를 할 때 무엇을 보나요 cut? 적용하는 것이 의미가 있는 것 같나요 grep? 그렇지 않다면 다시 생각해 보십시오.

그리고언제나man각 명령의 페이지를 주의 깊게 읽으십시오.


보너스sed: 동일한 작업을 수행하는 명령 은 다음과 같습니다 .

sed -n 's/^\(.*\)\t\+Adam$/\1/p' Data_1

이는 파일의 모든 줄을 반복하지만 하나 이상의 탭과 검색 문자열로 끝나는 줄만 인쇄합니다. 그런 다음 인쇄하기 전에 동일한 탭과 검색 문자열을 제거합니다.

답변4

Awk를 사용하는 간단한 방법:

awk '/ Adam$/ {print $1}' file                                             
101
502

관련 정보