공백을 탭으로 변경하는 내 awk 프로그램이 작동하지 않습니다.

공백을 탭으로 변경하는 내 awk 프로그램이 작동하지 않습니다.

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

관련 정보