첫 번째 열의 내용을 기준으로 파일 구분

첫 번째 열의 내용을 기준으로 파일 구분

확장명이 탭으로 구분된 파일이 여러 개 있습니다 .cluster. 다음 기준을 사용하여 첫 번째 열 내용을 기반으로 이러한 파일을 분류하고 싶습니다. ( 23은 파일 내의 실제 번호/내용입니다.)

  • class_1: 연속된 줄에 2AND 만 나타납니다.3
  • class_2: 2존재 만 함
  • class_3:만 3존재함

.txt파일 이름을 해당 클래스 이름으로 파일에 쓰고 싶습니다 . 쉘 스크립트를 사용하여 이 작업을 어떻게 수행할 수 있습니까?

답변1

for filename in *.cluster
do
    class=$(cut -d$'\t' -f1)                      # Part 1
    if [ $(wc -l "$filename") -eq 2 ]             # Part 2, start
    then
        class=1
    fi                                            # Part 2, end
    printf '%s\n' "$filename" >> class_"$class".txt # Part 3
done

이는 세 부분으로 나누어집니다:

  1. 기본적으로 고유한 줄의 첫 번째 필드를 기준으로 파일을 정렬합니다. 변수는 class각 줄의 첫 번째 탭 문자까지 파일에 있는 모든 항목으로 설정됩니다. 카테고리 2와 카테고리 3의 경우 이는 또는 이 파일에 한 줄만 있기 2때문 입니다.3

    cut구분 기호로 파일 분할,$'\t'Bash에서 탭을 작성하는 방식입니다., 첫 번째 구분된 필드만 출력되어야 -f1합니다 .cut

  2. 파일이 두 개라면철사( $(wc -l "$filename") -eq 2), 그것~ 해야 하다클래스 1이므로 class변수가 강제로 1이 되어 1단계의 값이 대체됩니다. if... fi이 문제를 해결하기 위해.
  3. 마지막으로 파일 이름이 적절한 클래스 파일에 추가됩니다.printf '%s\n' "$filename" >> class_"$class".txt

마지막으로 class_N.txt1, 2, 3의 각 N에 대해 세 개의 파일이 있으며 한 줄에 하나의 파일 이름이 있습니다. 어떤 파일에 어떤 파일이 있으면다른첫 번째 필드나 길이가 다른 경우와 같이 질문에 설명된 내용과 다른 내용이 있는 경우 추가 클래스 파일을 생성하게 됩니다.

파일 이름 자체에 개행 문자가 포함된 특이한 경우에는 충돌이 발생하지만(파일 이름 선택을 다시 고려할 기회를 제공하지만) 그렇지 않으면 문제가 없습니다.

관련 정보