다음 내용이 포함된 CAMS.txt라는 텍스트 파일이 있습니다.
4153999999999991
4153999999999992
4153999999999993
4153999999999994
4801999999999991
4801999999999992
4801999999999993
CAMS.txt 파일을 CAMS1.txt와 CAMS2.txt라는 두 개의 파일로 분할하고 싶습니다. 그 내용은 다음과 같습니다
CAMS1.txt
4153999999999991
4153999999999992
4153999999999993
4153999999999994
CAMS2.txt
4801999999999991
4801999999999992
4801999999999993
실제로 원본 CAMS.txt 파일의 처음 4자리를 기준으로 파일을 분할합니다. 항상 4153과 4801입니다. 저는 UNIX 세계를 처음 접했습니다 =)
답변1
awk '/^4153/ {print >"CAMS1.TXT"; next} {print >"CAMS2.TXT"}' CAMS.TXT
이를 수행하는 다른 방법이 있습니다. 또 다른 방법은 두 개의 grep 명령을 사용하는 것입니다.
grep "^4153" CAMS.TXT > CAMS1.TXT
grep -v "^4153" CAMS.TXT > CAMS2.TXT
이는 덜 효율적이지만 입력하기가 더 쉽고 첫 번째 grep이 완료된 후 셸 기록에서("위쪽" 화살표 키 사용) 이를 호출하고 몇 가지 사항을 변경할 수 있습니다. 물론 파일을 두 번 읽게 되므로 파일이 큰 경우에는 이렇게 하지 마세요.
답변2
이미 텍스트를 알고 있는 특별한 경우에는 다음과 같이 할 수 있습니다.
while read line; do
[[ $line =~ ^4153 ]] &&
printf "%s\n" "$line" >> CAMS1.TXT ||
printf "%s\n" "$line" >> CAMS2.TXT
done < CAMS.TXT
CAMS.TXT
이는 각 행을 변수로 읽어 들인 $line
다음, $line
4153으로 시작하면 CAMS1로 인쇄하고, 그렇지 않으면 CAMS2로 인쇄합니다.
또는 첫 번째 숫자를 기준으로 각 행을 표준 오류 또는 표준 출력으로 인쇄하고 그에 따라 명령의 출력을 리디렉션할 수 있습니다. 예를 들어:
perl -ne '/^4153/ ? print STDOUT : print STDERR' CAMS.TXT >CAMS1.TXT 2>CAMS2.TXT
텍스트가 무엇인지 모르는 경우 이름이 줄의 처음 4자인 파일에 각 줄을 쓸 수 있습니다.
awk '{print >> substr($1,1,4)}' CAMS.TXT
4153
위의 명령은 각각 4801
예상한 줄을 포함하는 두 개의 파일을 생성합니다 . 이는 다양한 모드를 처리할 수 있다는 장점이 있습니다.
답변3
여기는 순수bash
변형terdon 보다 일반적인 솔루션.
while read line; do
echo "$line" >> "${line:0:4}.txt"
done < CAMS.txt
결과 파일의 이름은 예제 입력 4153.txt
과 같이 각 줄의 처음 4자를 기준으로 지정됩니다 .4801.txt
다음 코드 조각을 사용하면 생성된 파일의 이름을 CAMS1.txt
등 으로 일괄 변경할 수 있습니다 CAMS2.txt
(원본 입력의 각 줄의 처음 4개 문자가 실제로 숫자라고 가정).
i=1
for file in [0-9][0-9][0-9][0-9].txt; do
mv "$file" "CAMS$(( i++ )).txt"
done
이는 원래 입력 파일의 숫자가 오름차순이고 예제 출력 파일의 파일 번호가 이 순서에 해당한다는 관찰에 의존합니다.
설명하다:
while read line; do
...
done < CAMS.txt
파일을 반복하면서 CAMS.txt
각 줄을 차례로 변수로 읽습니다 line
.
echo "$line" >> "${line:0:4}.txt"
현재 행의 처음 4개 문자에서 이름을 따온 파일에 현재 처리 중인 행을 추가합니다.
i=1
1
변수 에 값을 할당합니다 i
.
for file in [0-9][0-9][0-9][0-9].txt; do
...
done
이름에 4자리 숫자가 포함되고 .txt
확장자로 끝나는 현재 디렉터리의 파일을 반복합니다. 위의 코드 조각에서는 [0-9][0-9][0-9][0-9].txt
Shell이라고 합니다.전반적인 상황. 이 기능은 특정 유형의 패턴(이 경우 파일 이름)을 일치시키거나 확장하는 데 사용할 수 있습니다.
mv "$file" "CAMS$(( i++ )).txt"
현재 처리 중인 파일의 이름을 바꿉니다 file
. 대상 파일 이름 "CAMS$(( i++ )).txt
"은 CAMS
변수의 현재 값과 연결된 접두사로 구성됩니다 i
. 변수는 i
변수 내에서 동시에 증가됩니다.bash
산술 표현구문에 표시된 대로 (( ... ))
후위 증가 연산자를 사용합니다 ++
. $
앞의 추가로 (( ... ))
인해 표현식의 값이 생성됩니다. 이 경우i
앞으로대상 파일 이름을 나타내는 문자열로 확장되는 증분입니다. 마지막으로 .txt
대상 파일 이름에 접미사를 추가합니다 .