내 디렉토리에 텍스트 줄이 포함된 파일이 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