제목과 줄번호가 있는 고양이?

제목과 줄번호가 있는 고양이?

이런 파일이 있어요

$ cat trapetz
x = 0:0.0001:7pi
plot(x, sin(x).*cos(x))
Area = trapz(x, sin(x).*cos(x))
$ cat simpson 
f = inline(sin(x).*cos(x));
Area2 = quad(f, 0, 7pi, 1e-16)

나는 이런 것을 원한다

$ cat -b -t MISSING? trapetz simpson 
     traapetz 
     1  x = 0:0.0001:7pi
     2  plot(x, sin(x).*cos(x))
     3  Area = trapz(x, sin(x).*cos(x))
     simpson
     1  f = inline(sin(x).*cos(x));
     2  Area2 = quad(f, 0, 7pi, 1e-16)

아니면 거기에 화장실을 추가하는 쉬운 방법이 있다면 더 좋을 것입니다.

$ find |tee |...|wc... I feel now reinventing the wheel, there must be some ready...
     traapetz: xyz chars
     1  x = 0:0.0001:7pi
     2  plot(x, sin(x).*cos(x))
     3  Area = trapz(x, sin(x).*cos(x))
     simpson: zyx chars
     1  f = inline(sin(x).*cos(x));
     2  Area2 = quad(f, 0, 7pi, 1e-16)

하지만 난 이해해

$ cat -b -t trapetz simpson 
     1  x = 0:0.0001:7pi
     2  plot(x, sin(x).*cos(x))
     3  Area = trapz(x, sin(x).*cos(x))
     4  f = inline(sin(x).*cos(x));
     5  Area2 = quad(f, 0, 7pi, 1e-16)

실제로 고양이가 필요하지는 않지만 Pastebin 대신 위의 스니펫을 공유하고 표시하는 간단한 도구입니다. 표준 명령줄 항목을 원합니다. 사람들이 쉽게 재현할 수 있도록 codegolf.se용 간단한 퍼즐 페이스트를 만들려고 합니다...

답변1

빠른 쉘 스크립트:

#!/bin/sh
# usage: scriptname file1 file2 ...

for file in "$@"
do
    [ -f "$file" ] || continue
    set -- `wc "$file"`
    echo "${file}: lines $1 words $2 bytes $3"
    cat -b -t "$file"
done

이는 예제 출력처럼 작동하므로 누락된 파일은 자동으로 무시됩니다.

답변2

매우 조잡한 awk 구현:

BEGIN{
    OLDFILENAME="";
}
FNR==1{
    if (OLDFILENAME != "") {
        printf("#### Processed (chars: %s - lines: %s)\n", FWC, FLC);
    }
    printf("#### Processing: %s\n", FILENAME);
    OLDFILENAME=FILENAME;
    FWC=0;
    FLC=0;
}
{
    printf("%04d - %s\n", FNR, $0);
    FWC = FWC + length($0);
    FLC = FLC + 1;
}
END{
    if (OLDFILENAME != "") {
        printf("#### Processed (chars: %s - lines: %s)\n", FWC, FLC);
    }
}

실행 awk -f AWKFILE trapetz simpson결과:

#### Processing: trapetz
0001 - x = 0:0.0001:7pi
0002 - plot(x, sin(x).*cos(x))
0003 - Area = trapz(x, sin(x).*cos(x))
#### Processed (chars: 70 - lines: 3)
#### Processing: simpson
0001 - f = inline(sin(x).*cos(x));
0002 - Area2 = quad(f, 0, 7pi, 1e-16)
#### Processed (chars: 57 - lines: 2)

답변3

tail -n +1 trapetz simpson각 파일은 파일 이름을 나타내는 헤더와 함께 인쇄됩니다. nl trapetz simpson줄 번호는 인쇄하지만 파일 이름은 인쇄하지 않습니다. 당신은 사용해야합니다awk아니면 둘을 결합할 수 있는 쉘 접착제도 있습니다.

for x in trapetz simpson; do
  echo "$x: $(wc -c <"$x") bytes"
  nl "$x"
done

하단에 바이트 수를 인쇄하는 awk 솔루션은 다음과 같습니다.

awk '
    FNR == 1 && NR != 1 {print "end", fn, chars, "characters"; bytes=0}
    END {print "end", fn, chars, "characters"}
    FNR == 1 {print "begin", FILENAME; fn=FILENAME}
    1 {chars += 1 + length; printf "%7d ", FNR; print}
' trapetz simpson

답변4

명령 목록:

echo -e "trapetz\nsimpson" | xargs -I fn sh -c "wc -c fn | sed 's/\(.*\) \(.*\)/\2: \1 chars/';cat -b -t fn"

이 출력을 생성합니다

trapetz: 73 chars
     1  x = 0:0.0001:7pi
     2  plot(x, sin(x).*cos(x))
     3  Area = trapz(x, sin(x).*cos(x))
simpson: 59 chars
     1  f = inline(sin(x).*cos(x));
     2  Area2 = quad(f, 0, 7pi, 1e-16)

소프트웨어 버전은 다음과 같습니다.

  • 배쉬 4.2.53
  • GNU sed 4.2.2
  • xargs 4.5.11
  • 고양이8.21

관련 정보