열의 값 수 변경 [닫기]

열의 값 수 변경 [닫기]

다음과 같은 예제 파일이 있습니다.

2931
7895
6688
7895
2931
2931
6688

이 열과 다음과 같은 다른 열을 포함하는 파일을 생성하고 싶습니다.

2931 1
7895 2
6688 3
7895 2
2931 1
2931 1
6688 3

답변1

각각의 새로운 유형의 콘텐츠에 번호를 부여한 다음 동일한 콘텐츠가 있는 모든 행에 해당 번호를 표시해야 합니까?

awk '
    { if ( !seen[$0]++ ) {
       ind++ ; n[$0]=ind
      }
    }

    { print $0, n[$0] }
'

필요한 것을 하세요

사용에드 모튼제안은 다음과 같이 단순화되어 "awk"와 비슷하게 만들 수 있습니다.

awk '
   ! ($0 in n) { n[$0]=++ind }
               { print $0, n[$0] }
'

답변2

두 번째 열이 첫 번째 열의 각 숫자에 대해 고유한 숫자가 되기를 원한다고 가정합니다(질문에서 명확하지 않음).

$ awk '$2 = ( (k = key[$1]) ? k : key[$1] = ++n )' file
2931 1
7895 2
6688 3
7895 2
2931 1
2931 1
6688 3

n이는 에서 가장 최근에 할당된 숫자 와 연관 배열의 첫 번째 열과 결과 숫자("키") 간의 연관성을 추적합니다 key. 변수는 k첫 번째 열에 숫자가 있는 경우 두 번 역참조되지 않도록 하기 위한 아주 작은 최적화입니다.key

논리:

$1$20이 아닌 경우 해당 키가 할당됩니다. 0은 초기화되지 않았으며 $1이전에 본 적이 없음을 의미합니다. 0인 경우 사용 가능한 다음 번호를 키에 할당한 다음 키에 할당합니다.$2

print표현식의 결과는 0이 아니기 때문에 명시적으로 아무것도 만들 필요가 없습니다 . 표현식의 결과는 0이 아니므로 현재(수정된) 레코드를 인쇄하는 기본 작업을 트리거합니다.

이 명령의 좀 더 일반적인 변형은 입력 데이터에 있는 열 수에 관계없이 전체 행을 값으로 사용한 다음 끝에 새 열을 추가합니다.

awk '$(NF+1) = ( (k = key[$0]) ? k : key[$0] = ++n )' file

해당하는 "긴 표기" 구문을 사용하여 코드를 철자합니다.

awk '
{
    k = key[$0]

    if (k != 0)
        newval = k
    else
        newval = key[$0] = ++n

    print $0, newval
}' file

관련 정보