awk 출력을 원시 파일에 저장

awk 출력을 원시 파일에 저장
oldfile=test.csv
read -p "Enter File location: "$savelocation1
read -p "Enter File name: " $newfile1

grep "foobar" $oldfile > $savelocation1/$newfile1

awk ' BEGIN {FS=","}
          { 
              printf "%-5s %-10s" \n, $1, $3
          } ' < $savelocation1/$newfile1

grep은 행만 포함하는 새 파일을 생성 $newfile하지만 첫 번째와 세 번째 열을 인쇄하기 위해 awk를 수행할 때 문제는 awk의 출력을 쓰지 않고 결과를 터미널에 인쇄한다는 것입니다."foobar"$oldfile$newfile1$newfile1

편집 - 임시 파일을 사용하여 저장하고 출력한 다음 원본 파일로 전송합니다. 그러나 어떤 이유로 이것은 awk 문이 아닌 grep에서만 작동합니다.

$savelocation1/$oldfile> $savelocation1/tempfile.csv && mv $savelocation1/tempfile.csv $savelocation1/$newfile

답변1

GNU awk를 사용하는 경우:

gawk -i inplace '...' filename      # NOT redirected

moreutils패키지 를 설치하면

awk '...' filename | sponge filename

임시 파일 사용(awk 프로세스가 성공적으로 완료된 경우에만 원본 파일을 덮어씁니다)

t=$(mktemp)
awk '...' filename >"$t" && mv "$t" filename

그러나 여기서는 별도의 grep과 awk가 필요하지 않습니다.

awk -F, -v pattern="foobar" '
    $0 ~ pattern {
        printf "%-5s %-10s\n", $1, $3
    }
' $oldfile > $savelocation1/$newfile1

답변2

awk를 사용하고 있으므로 실제로 grep이 필요하지 않습니다.

oldfile=test.csv
read -p "Enter File location: " savelocation1
read -p "Enter File name: " newfile1

awk -F, '/foobar/ {printf "%-5s %-10s\n", $1, $3}' "$oldfile" > "$savelocation1/$newfile1"

그런데, 명령줄에서 두 개의 인수(또는 하나의 인수, 새 파일 이름)를 사용하도록 스크립트를 수정하는 것이 좋습니다. 이렇게 하면 스크립트를 쉽게 테스트하고 디버그할 수 있습니다.많은bash의 기록 기능을 사용하면 매번 다시 입력할 필요 없이 동일한 디렉터리 및 파일 이름을 입력할 수 있으므로 더 쉽습니다.

예를 들어

# accept directory and filename from command line args
# very primitive.  use getopts to do this properly.
[ -n "$1" ] && d="$1"
[ -n "$2" ] && f="$2"

# if not provided on the command line, ask for them
[ -z "$d" ] && read -p "Enter output file location: " d
[ -z "$f" ] && read -p "Enter output file name: " f

oldfile=test.csv
awk -F, '/foobar/ {printf "%-5s %-10s\n", $1, $3}' "$oldfile" > "$d/$f"

그런 다음 실행할 수 있습니다.

./myscript.sh somedir somefile.csv

관련 정보