파일의 모든 줄/디렉토리의 모든 파일을 모으는 방법

파일의 모든 줄/디렉토리의 모든 파일을 모으는 방법

내 디렉토리에 텍스트 줄이 포함된 파일이 100개 있습니다. 파일의 모든 줄을 한 줄로 연결하고 싶습니다. 한 번에 모든 파일에 대해 이 작업을 수행하고 싶습니다. cat여기서는 작동하지 않는 것 같습니다.

파일 1

atagacat
agataga
ctcatctat
tagcatag

File_1_cat

atagacatagatagactcatctattagcatag

파일_2

atagacat
agataga
ctcatctat
tagcatag

file_2_cat

atagacatagatagactcatctattagcatag

답변1

단순 cat+ tr이면 충분합니다. 그렇지 않은 경우 시스템에 문제가 있을 수 있습니다.

sh-4.2$ cat file1 file2 
atagacat 
agataga 
ctcatctat 
tagcatag 
atagacat 
agataga 
ctcatctat 
tagcatag
sh-4.2$ cat file1 file2 |tr -d '\n'
atagacatagatagactcatctattagcatagatagacatagatagactcatctattagcatag

여기에서 온라인으로 테스트해보세요:http://www.tutorialspoint.com/execute_bash_online.php?PID=0Bw_CjBb95KQMdUM4UER3SzE5Sk0

고쳐 쓰다

각 파일에서 새 줄을 개별적으로 제거하고 모든 파일을 함께 연결하지 않아야 함을 주석에서 명확히 한 후(ps: 주석에 유용한 설명을 추가하지 마십시오. 주요 질문을 편집하십시오) 다음과 같은 것을 사용할 수 있습니다. 콘텐츠:

perl -pe 's/\n//g' file >file_cat #perl -pe is directly equivalent to `sed`.  

또한 perl -pe를 사용하여 더 많은 파일을 동시에 일괄 교체할 수도 있습니다.

perl -pe 's/\n//g' -i file{1..100) #-i : in-place replacements in each file
OR
perl -pe 's/\n//g' -i.bak file{1..100) #in-place replacement keeping also a backup of original file

ALSO this works for all txt files in a directory
perl -pe 's/\n//g' -i.bak *.txt #in line replacement of all txt files in current directory keeping also a back up file

물론 다른 답변에서 언급된 루프 중 하나를 사용할 수도 있고 다음과 같이 사용할 수도 있습니다.

while IFS= -r -d '' fname;do 
  perl -pe 's/\n//g' "$fname" >"${fname}_cat"
  #any other command you might need like echo,cat,whatever
done < <(find . -maxdepth 1 -type f -name 'file*' -print0)

답변2

for name in ./*; do
  test -f "$name" && (tr -d '\n'; echo) <"$name" >"${name}_cat"
done

이렇게 하면 현재 디렉터리의 모든 일반 파일에서 (개별적으로) 모든 개행 문자가 제거됩니다(이것이 바로 그 일입니다 tr -d '\n'). 이렇게 하면 echo생성된 각 파일의 줄 끝에 개행 문자가 있게 됩니다.

답변3

tr이러한 목적 으로 사용하지 마십시오 . tr -d '\n'삭제모두개행 문자. 개행 문자가 없는 비어 있지 않은 파일은 텍스트 파일이 아닙니다. 일련의 문자를 올바른 텍스트 줄로 처리하려면 끝에 개행 문자가 필요합니다.

모든 줄을 하나로 연결하는 표준 명령은 붙여넣기 명령입니다.

 for file in ./*; do paste -sd '\0' "$file" > "${file}_cat"; done

이렇게 하면 현재 디렉터리에 있는 숨겨지지 않은 모든 파일에 대해 이 작업이 수행됩니다(일반, 심볼릭 링크, 디렉터리 등 유형에 관계없이). 외부 쉘에 숨김이 아닌 파일이 없으면 오류가 zsh발생 paste하고 빈 *_cat파일이 생성됩니다.

또한 file_cat열 수 없는 파일에 대해서는 빈 파일을 생성합니다. 이러한 문제 중 일부를 방지하려면 다음을 선호할 수 있습니다.

for file in ./*; do
  [ ! -f "$file" ] || paste -sd '\0' - < "$file" > "${file}_cat"
done

대신 ( -f일반 파일 또는 일반 파일에 대한 심볼릭 링크만 고려) 또는 더 짧지만 더 좋습니다 zsh.

file (./*(N-.)) do paste -sd '\0' - < $file > ${file}_cat

( D숨겨진 파일을 포함하려면 glob 한정자를 추가하세요).

-d '\0'널 구분 기호를 지정하는 표준 방법입니다.아니요NUL 문자 구분 기호를 나타냅니다. 일부 paste구현에서는 -d ''이식성이 없지만 이를 지원합니다(다른 paste구현에서는 구분 기호 누락에 대해 불평합니다).

답변4

그리고 awk:

awk '{printf $0> (FILENAME"_cat")}' *

새 파일 끝에 개행 문자가 필요한 경우:

awk '{printf $0> (FILENAME"_cat")}' *; sed -i -e '$a\' *_cat

관련 정보