여러 행이 있고 각 행에 두 개의 서로 다른 필드가 필요한 상황이 있습니다. 구체적으로, 참고문헌에 참고문헌 목록이 있는데 성과 연도를 알고 싶습니다.
입력 예:
Aloise-Young, P.A. (1993). The development of self-presentation. Self-promotion in 6- to 10-year-old children. Social Cognition, 11, 201-222.
Banerjee, R. (2002). Children's understanding of self-presentational behavior: Links with mental-state reasoning and the attribution of embarrassment. Merril-Palmer Quarterly, 48, 378-404.
Bennett, M., & Wellman, H. (1989). The role of second-order belief-understanding and social context in children's self-attribution of social emotions. Social Development, 9, 126-130.
원하는 출력:
Aloise-Young 1993
Banerjee 2002
Bennett 1989
성을 알 수 있나요cat file | cut -d, -f1
나는 년을 얻을 수 있습니다cat file | grep -o "[[:digit:]]\{4\}"
내 문제는 이제 두 개의 별도 출력이 있지만 원하는 방식으로 결합하는 방법을 모른다는 것입니다. 어떤 아이디어가 있나요? 나는 그것이 awk
내가 필요한 것을 할 수 있다고 생각합니다.
답변1
기본 도구로는 텍스트 처리가 너무 어렵다면,앗.
awk -F , '{last_name = $1; sub(/\).*/, ""); sub(/.*\(/, ""); print last_name, $0}'
sed는 거의 동일합니다. 읽기가 쉽지 않지만 awk에는 역참조가 부족합니다.
sed -n 's/^\([^,]*\),[^(]*(\([^()]*\)).*/\1 \2/p'
이 특정 작업의 경우 일반적으로 Perl이 더 쉽습니다. non-greedy 반복 연산자를 사용하여 *?
줄의 첫 번째 대괄호 부분이 캡처되도록 할 수 있습니다.
perl -l -ne '/^([^,]*),.*?\(([^()]*)\)/ and print "$1 $2"'
답변2
귀하의 코드 조각을 alois라는 파일에 넣었습니다.
sed -r 's/^([^ ,]+)[^0-9]+([0-9]+).*$/\1 \2/' alois
Aloise-Young 1993
Banerjee 2002
Bennett 1989
빠른 설명: sed의 검색 및 바꾸기 기능을 사용합니다.s/패턴/교체/
^([^ ,]+)는 줄의 시작 부분에서 공백이나 a가 아닌 항목을 가져와서 기억한다는 뜻입니다. (괄호는 이런 의미입니다.)
[^0-9]+는 숫자 값이 아닌 모든 것을 찾지만 무시합니다.
([0-9]+) 연속된 숫자를 가져오고 기억합니다.
.*$는 줄 끝의 다른 모든 항목과 일치합니다.
\1 \2 일치하는 모든 항목(전체 줄)을 위에 기억된 값으로 바꿉니다.
답변3
일반적으로 paste
명령의 출력을 절차적 대체와 연결할 수 있으므로 <(...)
귀하의 경우에는 다음과 같이 작동합니다.
paste -d ' ' <(cut -d, -f1 file) <(grep -o "[[:digit:]]\{4\}" file)
산출:
Aloise-Young 1993
Banerjee 2002
Bennett 1989
하지만 이렇게 하려면 두 번 전달해야 하는데 file
이는 불필요하므로 두 항목을 한 번에 가져올 수 있는 도구(예: )를 사용해야 할 것 sed
입니다 awk
.
답변4
섹시하지는 않지만 첫 번째 쉼표부터 첫 번째 여는 괄호까지 텍스트를 잘라낼 수 있습니다. 모든 것을 공백으로 바꾸십시오. 그런 다음 첫 번째 닫는 괄호부터 줄 끝까지 문자를 자릅니다.
1. convert this => , ..... ( to a space
2. convert this => )........ to nothing
주문하다
$ cat file | sed 's/,.*(/ /' | sed 's/).*//'
Aloise-Young 1993
Banerjee 2002
Bennett 1989