사이에 빈 줄을 사용하여 서로 다른 디렉터리에 있는 파일의 내용을 연결합니다.

사이에 빈 줄을 사용하여 서로 다른 디렉터리에 있는 파일의 내용을 연결합니다.

내 파일에는 dir1.txt다음 디렉터리의 이름이 포함되어 있습니다.

2
3
4

디렉터리 2에는 2_1.txt 및 2_2.txt 파일이 포함되어 있습니다.
디렉터리 3에는 3_1.txt 및 3_2.txt 파일이 포함되어 있습니다.
디렉터리 4에는 4_1.txt 및 4_2.txt 파일이 포함되어 있습니다
. 각 파일에는 두 줄이 포함되어 있습니다.

그런 다음 다음과 같은 중첩 루프를 만들었습니다.

#!/bin/bash
input="dir1.txt"
while IFS=read -r line
do
  for j in "$line/*"
  do sed -e '$s/$/\n/' $j
    #cat $j; echo
  done >> output.txt
done < "$input"

기본적으로 연결된 파일 사이에 빈 줄을 두고 싶습니다. 위 루프를 사용하면 dir 2의 마지막 파일 내용과 dir 3의 첫 번째 파일, 그리고 dir 3의 마지막 파일 내용과 dir 4의 첫 번째 파일 사이에 빈 줄만 표시됩니다. 사이에 빈 줄이 있지만, 또한 동일한 디렉터리에 있는 파일의 연결된 내용 사이에 빈 줄을 추가하고 싶습니다. 나는 cat $j; echo (위의 설명)를 사용해 보았지만 소용이 없었습니다. 중첩된 for 루프를 사용하여 다시 시도했는데 동일한 결과를 얻었습니다. 내 논리가 잘못된 것 같아요.

답변1

귀하의 논리는 정확하지만 작동하려면 몇 가지 수정이 필요했습니다.

  1. 이후에 누락된 공백이 추가되었습니다 IFS(그렇지 않으면 오류 발생).
  2. 참조를 (else ) "$line/*"로 변경합니다."$line"/*sed: can't read 2/*: No such file or directory
  3. 인용문 $j(더 나은 스타일을 위해)

sed두 버전 모두 cat/echo원래 해야 할 작업을 수행합니다.

#!/bin/bash

input="dir1.txt"
while IFS= read -r line
do
        for j in "$line"/*
        do
                sed -e '$s/$/\n/' "$j"
                #cat "$j"; echo
        done >> output.txt
done < "$input"

답변2

의심스러운 경우 주석과 stderr 출력을 사용하십시오.

또한 스크립트의 일부 측면이 GNU bash 버전 4.2.46(2) 릴리스(x86_64-redhat-linux-gnu)에서 작동하지 않습니다.

#!/bin/bash
input=dir1.txt

# Cycle through input
for dir in $(cat $input) 
do
    # Prints to stderr
    (echo "INFO - Dir: $dir" 1>&2)

    # Is dir a directory?
    if [ -d $dir ]
    then
        # Cycle through files
        for file in $dir/*   
        do
            # Prints to stderr
            (echo "INFO - File: $file" 1>&2)

            # Print contents
            cat $file

            # Blank line.
            echo
        done
    fi    
done >> output.txt 

관련 정보