다음과 같은 예제 파일이 있습니다.
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
$2
0이 아닌 경우 해당 키가 할당됩니다. 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