awk、bash、またはRubyを使ってファイルを繰り返すには?

awk、bash、またはRubyを使ってファイルを繰り返すには?

私のコンピュータには3つのMarkdownファイルがあります。

$ ls | grep md
bar.md
baz.md
foo.md

各ファイルには指定された内容があります。

$ cat *md
i am bar
i am baz
i am foo

*.mdたとえば、「パターンに一致するすべてのファイルを繰り返して、次のパターンを印刷したいfile_name: file_contents

私が一番好きなのは、ルビーを使うことです。しかし、私は練習したいです。ループの bashそして私の発展もアッ技術。

私にとっては、Rubyが最も簡単です。

#!/usr/bin/env ruby
# iterate over all markdown files in current directory

Dir.glob('*.md').each do |some_file|
  puts "#{some_file}: #{File.read(some_file)}"
end

出力:

$ ./iterate_over_files.rb
bar.md: i am bar
baz.md: i am baz
foo.md: i am foo

そしてリンクをたどるバッシュリソース次のforループを作成しました。

#!/usr/bin/env bash
# iterate over all markdown files in current directory

for some_file in *.md
do
  echo $some_file: `cat $some_file`
done

同じ出力を提供します。

$ diff <(./iterate_over_files.sh) <(./iterate_over_files.rb) # no difference

デモを見て学んだブライアンコナハンそしてレビューで彼のスライド次のパターンに従うので、awkを使用する良い機会です。

for each file
  for each input line 
    for each pattern
      if the pattern matches input line
        do the action
  • awkを使用してこのパターンを活用し、すべてのMarkdownファイルを繰り返し、フォーマットされた結果を印刷するにはどうすればよいですか?

答え1

FILENAME変数を使用して各ファイルを処理し、ファイル名を出力するのはどうですか?

$ awk '{print FILENAME":",$0}' *.md
bar.md: i am bar
baz.md: i am baz
foo.md: i am foo
$

またはこれは少し見苦しいですが、ファイル名の後にファイルの内容を$ 0に設定するだけです。デフォルトの動作はawk$ 0を印刷することなので、必要ありませんprint

$ awk '$0=FILENAME": "$0' *.md
bar.md: i am bar
baz.md: i am baz
foo.md: i am foo
$

別の方法。 FILENAMEを使用する代わりに、ARGVパラメーター配列を使用してください。

$ awk '$0=ARGV[++z]": "$0' *.md
bar.md: i am bar
baz.md: i am baz
foo.md: i am foo
$

答え2

bashマニュアルによると、$(< FILE)代わりにを使用する必要があります$(cat FILE)。ただし、コマンド置換をまったく使用する必要はありません。

for some_file in *.md
do
  echo -n "$some_file: "
  cat $some_file
done

プロセスの置き換えについて既に知っているので、次のこともできます。

for some_file in *.md
do
  cat <(echo -n "$some_file: ") $some_file
done

関連情報