한 번에 두 줄씩 파일을 반복하고 필요한 커플릿을 복사하는 bash 스크립트

한 번에 두 줄씩 파일을 반복하고 필요한 커플릿을 복사하는 bash 스크립트

작업: Bash를 사용하여 하나의 파일(예: file1.txt)을 한 번에 두 줄씩 반복하고, 발견된 각 커플릿을 두 번째 파일(예: file2.txt)에 복사해야 하는지 여부를 묻는 메시지를 표시합니다. 이 명령은 grep -A 1 "searchterm" file1.txt내가 찾고 있는 출력 유형을 제공합니다. 따라서 스크립트는 몇 줄마다 반복해야 하며, 커플릿을 두 번째 파일에 복사할지 묻고, 다음 몇 줄에 대해 동일한 작업을 증가시키고 파일 끝까지 반복해야 합니다. 이 파일에는 총 4000줄 정도가 있는데, 그 중 400줄 정도를 두 번째 파일에 복사하고 싶습니다.

파일의 내용은 다음 예제와 유사합니다.

#searchterm blah
possible additional needed line 1
#searchterm blee
possible additional needed line 2
#searchterm blob
possible additional needed line 3
#searchterm bloh
possible additional needed line 4
#searchterm bluh
possible additional needed line etc

두 번째 파일로 복사하는 것은 cp >>파일 끝에 추가하여 수행할 수 있습니다. 나는 for 루프 및/또는 while이 이에 적합할 것이라고 생각합니다. 그것의 점진적인 부분은 현재로서는 일종의 탈출구입니다. 하지만 내 bash 스크립팅 기술/지식은 기껏해야 평균 수준입니다. 의견을 주시면 감사하겠습니다.

나중에 수정 이것이 내가 추구하는 일의 시작이었습니다.https://stackoverflow.com/questions/8314499/read-n-lines-at-a-time-using-bash):

while read -r ONE; do
    read -r TWO
    echo $ONE
    echo $TWO
    sleep 3
    # replace above sleep command with command(s) that copy lines or exit back to while loop
done < file1.txt

이번에는 file1.txt에서 두 줄을 읽고 각 커플릿을 터미널에 출력합니다. sleep 3 줄은 "이 두 줄을 file2.txt에 복사하시겠습니까? y 또는 n으로 대답하세요."와 같이 사용자에게 입력을 요청하는 일부 루틴으로 대체되어야 합니다. 사용자가 y를 선택하면 다음 두 줄을 printf $ONE >>file2.txt && printf $TWO >>file2.txt반환합니다 . while행 루프 이전에 유사한 작업이 실행됩니다. 사용자가 n이라고 대답하면 루프는 마지막으로 중지된 위치로 돌아가서 file1.txt의 다음 두 줄을 터미널에 인쇄하고 동일한 질문을 합니다. 진전?

이후 편집: 전체 솔루션에 대한 첫 번째 시도가 실패했습니다.

while read -r ONE; do
    read -r TWO
    echo $ONE
    echo $TWO
    read -n 1 -p "Would you like to copy the above 2 lines to the new  file? [Y,n]" ans
        if [[ $ans == "Y" || $ans == "y" ]]; then
                printf $ONE >>file2.txt && printf $TWO >>file2.txt
        else
                echo "Resuming loop"
        fi
done < file1.txt

작동하지 않습니다. 이는 출력이 cat file1.txt명령줄에서 실행하는 것과 크게 다르지 않다는 것을 의미합니다. 하지만 어쩌면 그것은 내가 이 대본을 통해 달성하고자 하는 것이 무엇인지에 대한 더 나은 아이디어를 줄 수도 있습니다.

나중에 편집: 절반 실행 중 추가 조사에 따르면 해당 작업을 수행하려면 파일 설명자라는 것이 필요할 수도 있습니다. 이 링크를 사용하세요https://stackoverflow.com/questions/8886683/read-stdin-for-user-input-when-a-file-is-already-redirected-to-stdin스크립트를 다음과 같이 수정했습니다.

while read -r ONE <&3; do
    read -r TWO <&3
    echo $ONE
    echo $TWO
    read -n 1 -p "Would you like to copy the above 2 lines to the new  file? [Y,n]" ans
        if [[ $ans == "Y" || $ans == "y" ]]; then
                printf $ONE >>file2.txt && printf $TWO >>file2.txt
        else
                echo "Resuming loop"
        fi
done 3<file1.txt

이를 통해 기본적으로 내가 읽고 있는 파일의 행 쌍을 표준 입력으로 복사하여 다른 파일로 복사할 수 있습니다. 거의 내가 원했던 것입니다. 복사한 줄 쌍이 같은 줄로 끝나지 않도록 만들고 있는 파일에 개행 문자를 삽입하는 방법을 알아내면 됩니다. 추가 입력 및 설명을 환영합니다.

답변1

다음 줄을 변경하세요.

printf $ONE >>file2.txt && printf $TWO >>file2.txt

도착하다

printf "$ONE\n" >>file2.txt && printf "$TWO\n" >>file2.txt

그러면 각 printf 문의 출력이 새 줄에 배치됩니다.

답변2

사용행복하다(이전 Perl_6)

raku -ne 'm/blah | blob/ ?? put($_, "\n", get) !! next;'  

#OR

raku -e 'for lines() { m/blah | blob/ ?? put($_, "\n", get) !! next};' 

또는

raku -e 'for lines.rotor(2) { .join("\n").put if m/blah | blob/ };'

#OR

raku -e 'for lines.batch(2) { .join("\n").put if m/blah | blob/ };'

반드시 그럴까요 bash? 이것은 Raku로 작성된 답변입니다. Raku의 lines루틴은 입력을 느리게 읽으므로 매우 효율적입니다. 처음 두 답변은 일치하는 줄을 반환하고, gets-and-는 각 일치 항목 다음의 줄을 반환합니다.

세 번째 답변은 rotor한 번에 두 줄을 분석할 수 있도록 각 쌍을 함께 배치합니다. 네 번째 예 rotor에서는 "불완전/부분" 그룹화가 마지막에 제거되므로 반환 batch부분 그룹화( 와 동일 rotor(2, partial => True))를 사용합니다.

입력 예:

#searchterm blah
possible additional needed line 1
#searchterm blee
possible additional needed line 2
#searchterm blob
possible additional needed line 3
#searchterm bloh
possible additional needed line 4
#searchterm bluh
possible additional needed line etc

출력 예(네 가지 예 모두):

#searchterm blah
possible additional needed line 1
#searchterm blob
possible additional needed line 3

https://raku.org

관련 정보