スペースを含むテキスト列を1つのフィールドとして扱う

スペースを含むテキスト列を1つのフィールドとして扱う

次の形式のファイルがあります。
INTEGER INTEGER TEXT

テキストはUnicodeであり、スペースを含めることができます。
printfを使用してファイルの最初のINTEGERとTEXTを特定の形式で印刷するためにawkを使用しようとしています。
問題:一部の行のTEXTにスペースがあるため、$ 3には完全なTEXTがないため、より多くのフィールドで行が破損します。

例:

12 42956    Cinema - 3D/Multiplex  
7  12560    Status Update  
5  184   Movie  

私のアプローチは次のとおりです。

awk '{ c=$3; for(i=4; i< NF;++i){c=c" "$i}; printf "<tag>%d</tag>\n<tag>%s</tag>\n", $1,c}';  

しかし、もっと良い方法があると思います。

ベストアンサー1

awkデータが明確に指定されたレコードから来た場合に便利です。このデータは使用できません。ただし、データは「integer stuff the_restフォーマット」で、「integer」または「」stuffにスペースはありません。これがまさにreadユーティリティが読みたいものです。読み取るように指定した変数と同じスペースで区切られた単語を読み、行の「残り」を最後の変数に入れます。

bash-4.4$ while read -r integer stuff the_rest; do printf '%d\t"%s"\n' "$integer" "$the_rest"; done <data
12      "Cinema - 3D/Multiplex"
7       "Status Update"
5       "Movie"

すべての末尾のスペースを自動的に削除します。

おすすめ記事