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