내용에 따라 텍스트 파일을 여러 텍스트 파일로 분할하는 방법은 무엇입니까?

내용에 따라 텍스트 파일을 여러 텍스트 파일로 분할하는 방법은 무엇입니까?

다음 내용이 포함된 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다음, $line4153으로 시작하면 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].txtShell이라고 합니다.전반적인 상황. 이 기능은 특정 유형의 패턴(이 경우 파일 이름)을 일치시키거나 확장하는 데 사용할 수 있습니다.

mv "$file" "CAMS$(( i++ )).txt"

현재 처리 중인 파일의 이름을 바꿉니다 file. 대상 파일 이름 "CAMS$(( i++ )).txt"은 CAMS변수의 현재 값과 연결된 접두사로 구성됩니다 i. 변수는 i변수 내에서 동시에 증가됩니다.bash 산술 표현구문에 표시된 대로 (( ... ))후위 증가 연산자를 사용합니다 ++. $앞의 추가로 (( ... ))인해 표현식의 값이 생성됩니다. 이 경우i 앞으로대상 파일 이름을 나타내는 문자열로 확장되는 증분입니다. 마지막으로 .txt대상 파일 이름에 접미사를 추가합니다 .

관련 정보