2016-03-15 18 views
5

フィールドが単一のスペースで区切られたファイルを扱っています。awkのフィールド区切り文字としての単一スペース

awkは「1つ以上の空白」としてFS " "を解釈します。これは、フィールドの1つが空のときにファイルを誤読します。

FSとして「スペースがないスペース」(" (?!)")を使用しようとしましたが、awkは否定的な先読みをサポートしていません。 "single space field separator awk"のような単純なgoogleのクエリは、FS=" "の特別扱いを説明しているマニュアルページにしか送られませんでした。私は関連するマニュアルページを見逃しているに違いありません。

フィールド区切り文字としてawkを使用するにはどうすればよいですか?

+0

は私が実際に関連するマニュアルページを開いていた... https://www.gnu.org/software/gawk/manual/ html_node/Regexp-Field-Splitting.html –

+0

'FSは" [] "に設定して、フィールドセパレータとして単一のスペースを使用することができます。 ' –

+0

awk -F' [] '' {printf">%s <"、$ 2 } '<<<' a b''は私のためには機能しません、gawkを使用しています – hek2mgl

答えて

9

これは

$ echo 'a b' | awk -F'[ ]' '{print NF}' 
5 

ところ、これは一つとして、すべての連続した空白を扱うように動作するはずです。

$ echo 'a b' | awk -F' ' '{print NF}' 
2 

フィールドの値としてコメントに基づいて、それは特別な配慮を必要とする、空の文字列または空白はおそらく、ホワイトスペースのために良い試合がコンテンツを分離していない非常に異なるものです。

私はcutで前処理をお勧めしますし、例えば、区切り文字を変更

$ echo 'a b' | cut -d' ' -f1,3,5 --output-delimiter=, 
a,,b 
+0

区切り文字で囲まれた2つのスペースが2つのスペースを含むフィールドであるため、OPは「5」ではなく「3」を希望しているようです。 – hek2mgl

+0

@ hek2mgl Uh、いいえ、フィールドにフィールドセパレータを含める方法はありません。フィールドセパレータが単一のスペースである場合、隣接する2つのスペースは、空のフィールドの周りのセパレータです。 – tripleee

+0

@tripleeeはい。私はまだ質問が面白いと思う、私はそれが一般的に有効なユースケースであることを意味しますが、私はその場合に別のデリミタを選んだでしょう。 – hek2mgl

関連する問題