awk, bash 또는 Ruby를 사용하여 파일을 반복하는 방법은 무엇입니까?

awk, bash 또는 Ruby를 사용하여 파일을 반복하는 방법은 무엇입니까?

내 컴퓨터에는 세 개의 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

관련 정보