awk 印刷スペースで区切られた列 [閉じる]

awk 印刷スペースで区切られた列 [閉じる]

私のディレクトリには次の* .datファイルがあります。

$ cat holiday_us.dat
20210101 1     New Year's Day
20210102 2     Labor Day
20210103 1     Independence Day

私が望む出力:

20210101_New Year'sDay
20210102_LaborDay
20210103_IndependenceDay

私が試したコード:

for file in /home/path/holly*.dat
do 
awk -f ' ' '{print $1,"_",print$2}' "$file"
done
}

次の結果が表示されます。

20210101
New
20210102
Labor
20210103
Independence

答え1

出力フィールドの区切り文字をOFSnull(空)文字列と$2次に変更します_

$ awk -v OFS= '{ $2="_" }1' *.dat
20210101_NewYear'sDay
20210102_LaborDay
20210103_IndependenceDay

答え2

cat data | awk '{print $1"_"$3$4$5}'

これにより所望の結果が出力される。質問がある場合はお役に立てば幸いです。いつでもお問い合わせください。

またはこれを行うこともできます。

awk '{print $1"_"$3$4$5}' data.dat

for file in /path/to/file/holly*.dat; do awk '{print $1"_"$3$4$5}' $file; done

答え3

これはトリックを行う必要があります。

for file in /home/path/*.tmp ; do cat $file |  awk '{print$1,"_",$3$4$5}' | sed 's/ //g' ; done

答え4

この awk 文は C スタイルの printf 文を使用します。ここに追加される利点は、出力形式をより柔軟に指定できることです。ここで、NF は awk によって設定された現在行のフィールド数です。

awk -F ' ' '{printf("%s_", $1); for (i=3; i<=NF;i++) printf("%s ", $i);print ""}'$ ファイル

出力例:

20210101_旧正月20210102_
労働
日20210103_独立記念日

実際、スペースはデフォルトの区切り文字なので、次のものを使用することもできます。

awk '{printf("%s_", $1); for (i=3; i<=NF;i++) printf("%s ", $i);print ""}'$ ファイル

関連情報