1번 시도

1번 시도

DD-MM 형식의 DOB에 매핑된 이름 목록이 포함된 파일을 생성하려고 합니다.

시도 1)에서 일치가 작동하지 않았기 때문에 시도 2)와 같이 명령줄에서 실행을 시도했지만 여전히 작동하지 않았습니다. 어떤 제안이 있으십니까?

감사해요

file.txt
jason 08-04

1번 시도

XXXXXX$ cat a.txt
#!/bin/bash

file="file.txt"

current_date=$(date +%d-%m)
awk -F" ", 'if ($2==$current_date) print $1)' "$file"

2번 시도

awk -F" ", '{
if ($2=='08-04')
   print "$1"
}' file.txt

답변1

양측 모두에 문제가 있습니다.노력하다:

시도 #1질문:

  • 변수가 $current_date작은따옴표 안에 삽입되지 않았습니다.
  • 필드 구분 기호 뒤에 쉼표가 잘못 배치되었습니다 awk -F" ",. <--
  • ifawk의 작업 구분 기호 외부에서 연산자를 사용하려고 하면 오류가 { ... }발생합니다.syntax error ...

시도 #2질문:

  • 필드 구분 기호 뒤에 쉼표가 잘못 배치되었습니다 awk -F" ",. <--
  • 작은따옴표가 깨졌습니다.'...'08-04'...'

올바른 방법(변수를 awk 명령에 매개변수로 전달):

awk -v d="$curr_date" '$2==d{ print $1 }' "$file"

답변2

시도 1의 경우 셸에서 변수를 확장하려면 큰따옴표를 사용해야 하지만 결과적으로 다음과 같이 $1다시 작성하는 것이 좋습니다.

awk -v current_date="$(date +%d-%m)" '$2 == current_date {print $1}' "$file"

current_date여기에서는 options 를 사용하여 awk 변수를 설정합니다 -v.

시도 2에서는 작은 따옴표로 묶인 문자열 내에 작은 따옴표를 사용하면 따옴표가 종료됩니다. awk 문자열에는 큰따옴표를 사용해야 하며 인용해서는 안 됩니다 $1.

awk '$2 == "08-04" {print $1}' file.txt

이 두 가지 시도 중에서 를 사용하는 이유를 이해할 수 없습니다 -F" ",. 기본적으로 awk는 공백으로 분할되므로 표시된 예제 입력에 대한 필드 구분 기호를 생략할 수 있습니다 ,. 또한 awk 표현식은 awk에 더 관용적인 {if (A) B}just 로 다시 작성될 수 있는 경우 가 많습니다.A {B}

관련 정보