패턴을 찾은 후 패턴이 "100"인 두 번째 열을 선택하는 방법

패턴을 찾은 후 패턴이 "100"인 두 번째 열을 선택하는 방법

cat file_1:

height 100  3 name
gray   125  8 yellow
base   100  5 age
red    455  9 tea
level  100  7 yak

내 최종 파일에는 "100" 패턴이 포함된 두 번째 열만 있어야 합니다.

cat final_file:

name 
age
yak

답변1

val0x00ff가 제안한 대로 awk이는 재정의될 수 있습니다.

이는 필드 2의 어느 위치에서나 100과 일치합니다. 예를 들어 "foo100bar"는 일치합니다.

awk '$2 ~ 100 {print $NF}' file_1 >final_file

이는 필드 2의 100과만 일치합니다.

awk '$2 == "100" { print $NF }' file_1 >final_file

답변2

일반적인 경우에는 다음 코드와 같은 작업을 수행합니다.

#!/bin/bash
matching_column=2  
filename="def"
awk -v matching_col=${matching_column}\
    -v printing_col=$((matching_column+2))\
    '$matching_col ~ 100 {printf "%s\n", $printing_col}' "$filename"  

pattern이렇게 하면 변수를 사용하여 일치해야 하는 열을 선택할 수 있습니다 matching_col. 그러면 인쇄할 열이 다음과 같이 계산됩니다 printing_col=matching_column+2. 그런 다음 Printing_column 필드에 지정된 값을 인쇄할 수 있습니다 $printing_col.

답변3

grep및 의 경우 pcre공백이 열 구분자로 간주됩니다.

$ cat ip.txt 
height 100  3 name
gray   125  8 yellow
base   100  5 age
red    455  9 tea
level  100  7 yak

열을 일치시키고 100두 번째 열에서 텍스트를 추출합니다.

$ grep -oP '\b100\s+\S+\s+\K\S+' ip.txt 
name
age
yak

두 번째 열을 일치시킨 100다음 두 번째 열의 텍스트를 가져옵니다.

$ grep -oP '^\S+\s+100\s+\S+\s+\K\S+' ip.txt 
name
age
yak

둘 다 긍정적인 뒤돌아보기를 사용합니다. 로 표시됩니다 \K. 첫 번째는 \b단어 경계를 표시하는 데 사용됩니다(이와 같은 일치를 피하기 위해 1100).

> final_file출력 저장 명령 추가

답변4

위의 Steves의 awk 솔루션이 최고라고 생각하지만 이제 그렇게 했으니 여기에 sed 변형이 있습니다.

sed -n 's/.* 100 .* \([a-z].*$\)/\1/p' original_file > newfile

이를 통해 다음을 수행할 수 있습니다...

cat newfile 
name
age
yak

관련 정보