내 텍스트 파일에 다음이 포함되어 있다고 가정해 보겠습니다.
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