awkを使用してスペースを含むファイル名を抽出する

awkを使用してスペースを含むファイル名を抽出する

次の出力ラインがあります。

M file.txt

次のawkプログラムを入力してください:

awk '{printf("\t%s: %s %s\n", FNR, $1, $2)}'

返品

1: M file.txt

これは可能であり、通常はそうです。ただし、ファイルにスペースがあり、出力行が次のような場合:

M "tmux split-window subcommand.md"

awkはこれを提供します:

1: M "tmux

ただし、希望の出力は次のとおりです。

1: M "tmux split-window subcommand.md"

この問題をどのように解決できますか?

答え1

現在の行に行番号を追加するには、次のコマンドを使用しますawk

awk '{ printf("%d: %s\n", FNR, $0) }'

0番目のフィールド$0は行全体です。

答え2

区切り文字を使用すると、引用符の間のスペースは別の単語として扱われません。

したがって、入力文字列に表示されないと思われる区切り文字を使用できます。

echo 'M "tmux split-window subcommand.md"' | awk -F: '{printf("\t%s: %s %s\n", FNR, $1, $2)}' 1: M "tmux split-window subcommand.md"

答え3

この試み:

  #!/usr/bin/awk -f
  BEGIN {
        #FPAT = "([^,]+)|(\"[^\"]+\")" # seperator is ,
        #FPAT = "([^,]*)|(\"[^\"]*\")" # seperator is , and allow empty field -> notice the "+" changed to "*"
        FPAT = "([^ ]+)|(\"[^\"]*\")" # seperator is <space> -> notice the "," changed to " "
  }
  {
    printf("%d: ", FNR);
        for (i = 1; i <= NF; i++) {
            printf("%s ", $i)
        }
    printf("\n");
  }

GNU awkオンラインマニュアルから入手しました。この一つ。 https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html

関連情報