
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
タブ列が間違って配置されても心配しないでください。
各列(姓、名、修士、生年月日)は1つのタブに分かれています。
質問:
以下のコードがなぜ機能しないのですか?
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
新しい出力フィールド区切り文字を適用する前にフィールドの1つを変更する必要があるためです。この欠陥(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