Моя 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 
  • Не беспокойтесь, если столбцы с вкладками не совпадают.

  • Расстояние между каждым столбцом (Фамилия, имя файла, имя файла MSc и дата рождения) – это одна вкладка.

Вопрос:

Почему этот код не работает для меня?

 awk 'BEGIN {IFS=" "} {OFS="\t"} {print $1,$2,$3,$4}' students.txt 

 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 

Это не верно:

 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