awk
데이터 파일을 읽고 students.txt
다음과 같이 탭 형식으로 데이터를 출력하는 쉘 스크립트를 작성하는 방법 :
Surname Forename MSc Stream Date of Birth
Smith John IT 15.01.1986
Taylor Susan IT 04.05.1987
Thomas Steve MIT 19.04.1986
탭 열이 잘못 정렬되어도 걱정하지 마십시오.
각 열(성, 이름, 석사 및 생년월일)은 하나의 탭으로 떨어져 있습니다.
질문:
아래 코드가 왜 작동하지 않습니까?
awk 'BEGIN {IFS=" "} {OFS="\t"} {print $1,$2,$3,$4}' students.txt
답변1
awk '{$1=$1}1' OFS="\t" students.txt
개념의 증거
$ awk '{$1=$1}1' OFS="\t" students.txt
Surname Forename MSc Stream Date of Birth
Smith John IT 15.01.1986
Taylor Susan IT 04.05.1987
Thomas Steve MIT 19.04.1986
설명하다
작동하지 않는 이유는 awk
새 출력 필드 구분 기호를 적용하기 전에 필드 중 하나를 변경해야 하기 때문입니다. 이 결함(IMHO)에 대한 해결 방법은 필드를 자체적으로 설정하는 것입니다.$1=$1
이 간단한 변경의 경우 tr
또는sed
tr -s ' \t' '\t*' < students.txt
sed 's/[[:space:]]\+/\t/g' students.txt
답변2
이것은 잘못된 것입니다:
awk 'BEGIN {IFS=" "} {OFS="\t"} {print $1,$2,$3,$4}' students.txt
OFS를 너무 늦게 설정했기 때문입니다(BEGIN 블록이 아님). 이 작업을 수행:
awk 'BEGIN {OFS="\t"} {print $1,$2,$3,$4}' students.txt
4개의 공백으로 구분된 필드가 있도록 제목을 변경하는 것을 잊지 마세요.
Surname Forename MSc_Stream Date_of_Birth