>

여러 파일이 있습니다 : (실제로 80이 있습니다)

file1.dat

2 5
6 9
7 1

file2.dat

3 7
8 4
1 3

두 번째 줄을 모두 포함하는 파일로 끝내고 싶습니다. 즉,

output.dat

6 9
8 4

지금까지 가지고있는 것은 파일 이름을 통해 반복되지만 파일은 파일보다 먼저 덮어 씁니다. 예 : 위 파일의 출력은 단지

8 4

내 셸 스크립트는 다음과 같습니다 :

post.sh

TEND = 80
TINDX = 0
while [ $TINDX - lt $TEND]; do
awk '{ print NR==2 "input-$TINDX.dat > output.dat
TINDX = $((TINDX+1))
done

  • 답변 # 1

    while 제거  루프 브레이스 확장 및 FNR 를 사용 내장 awk  변수 :

    awk 'FNR==2{print $0 > "output.dat"}' file{1..80}.dat
    
    

  • 답변 # 2

    sed  충분할 것이다 :

    sed -sn 2p file{1..80}.dat > output.dat
    
    

    -s  각 파일에서 두 번째 줄을 인쇄하려면 옵션이 필요합니다. 그렇지 않으면 첫 번째 파일의 두 번째 줄만 인쇄됩니다.

  • 답변 # 3

    어떻게 ... 와이즈 비즈  ...

  • 답변 # 4

    아라 거어의 head -n 2 input.dat | tail -n 1 | awk  해결책이 가장 좋습니다. 근데 난 약간의 sed 를 즐기기 때문에  절단, head|tail 가  단일 head|tail 가 아닌 여러 파일을 지원하는 솔루션 . sed에 파일 목록을 전달하는 대신 for-loop를 사용하면 sed로 두 번째 줄을 추출하기 전후에 파일로 다른 작업을 더 쉽게 수행 할 수 있습니다.

    input.dat
    
    

    복잡하게 작성된 여러 줄 버전 :

    NB : 아래 코드가 실행됩니다. 우리는 # empty output.dat first rm output.dat # have a one-liner for file in *.dat; do head -2 $file | tail -1 >> output.dat; done 후 줄 바꿈을 자유롭게 할 수 있습니다 | 또는 && 다음 줄에서 명령을 계속하십시오. 우리는 사이에 의견을 넣을 수도 있습니다. 나는 이것을 알지 못하고 (어디서나 그것을 보지 못하면서)을 보냈다. 이 스타일은 대화식 프롬프트에서 유용하지 않지만 스크립트 파일을 정리하지 않습니다.

    ||
    
    

  • 답변 # 5

    이 작업을 수행하는 방법은 여러 가지가 있습니다. @aragaer의 sed 답변이 가장 좋습니다.

    순전히 bash 내장을 사용하고 외부 유틸리티를 포크 할 필요가없는 것입니다 :

    # empty output.dat first
    rm output.dat
    for file in *.dat; do
        # file -> lines 1 and 2 of file
        head -2 $file |
        # lines 1 and 2 of file -> line 2 of file >> appended to output.dat
        tail -1 >> output.dat
    done
    
    
    for f in file{1..80}.dat; do { read && read && printf "%s\n" "$REPLY"; } < "$f" done > output.dat

관련 자료

  • 이전 bash - diff 출력을 색칠하는 방법?
  • 다음 filesystems - 리눅스는 "실제 파일"과 "가상 파일"을 어떻게 읽습니까?