패턴을 찾은 후 두 번째 열을 선택하는 방법은 패턴이 '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. 그러면 printet될 열은 다음과 같이 계산됩니다 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

관련 정보