두 필드를 같은 행에 함께 배치

두 필드를 같은 행에 함께 배치

여러 행이 있고 각 행에 두 개의 서로 다른 필드가 필요한 상황이 있습니다. 구체적으로, 참고문헌에 참고문헌 목록이 있는데 성과 연도를 알고 싶습니다.

입력 예:

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

관련 정보