
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