약 500만 행(300열)을 그룹으로 재배열하고 싶습니다.
데이터는 다음과 같습니다. 다양한 실험(2열)이 다양한 연도(1열)에 기기(3열)를 사용하여 다양한 위치(맨 위 행의 4열에서 시작하는 열 머리글)에서 수행되었습니다. 행렬의 숫자(2행에서 시작하여 4열에서 시작)는 실험이 성공한 인스턴스의 수를 나타냅니다.
내가 원하는 것은 행을 다시 정렬하는 것입니다
입력하다
345 346 347 348 349 350 351 352
2014 Exp1 IBM 24 45 22
2014 Exp2 LEN 23 32 34
2014 Exp3 LEN 2 34 34
2014 Exp4 IBM 34 44 43
2014 Exp5 IBM 2 45 51 45
2014 Exp6 IBM 34 23 54
2014 Exp7 IBM 23 23 24
2014 Exp8 IBM 34 45 56
2014 Exp9 LEN 24 45 45
2014 Exp10 LEN 43 45 32
2015 Exp11 IBM 34 55 33 34
2015 Exp12 IBM 1 33 4 5
2015 Exp13 IBM 43 55 34 43
2015 Exp14 IBM 45 32 43 4
2015 Exp15 IBM 23 4 5
2015 Exp16 IBM 32 34 43
2015 Exp17 IBM 32 34 46
2015 Exp18 LEN 32 54 67
2015 Exp19 SCL 56 6 4 45 56
2015 Exp20 LEN 67 56 76
2015 Exp21 LEN 45 56 65
2015 Exp22 SCL 45 55 54
2015 Exp23 SCL 4 55 45
내가 원하는 것은 행을 다음과 같은 그룹으로 재정렬하는 것입니다.
1) 동일 연도 이내 2) 동일 상품 사용
다음과 같이 그룹을 만듭니다.
각 그룹에는 최소 3개의 공통 위치가 있었고 각 위치에는 최소 20번의 성공적인 실험이 있었습니다.
요청된 출력
345 346 347 348 349 350 351 352
1 2014 Exp1 IBM 24 45 22
1 2014 Exp4 IBM 34 44 43
1 2014 Exp7 IBM 23 23 24
2 2014 Exp2 LEN 23 32 34
2 2014 Exp9 LEN 24 45 45
2 2014 Exp10 LEN 43 45 32
3 2014 Exp5 IBM 2 45 51 45
3 2014 Exp6 IBM 34 23 54
3 2014 Exp8 IBM 34 45 56
4 2015 Exp11 IBM 34 55 33 34
4 2015 Exp13 IBM 43 55 34 43
4 2015 Exp14 IBM 45 32 43 4
5 2015 Exp16 IBM 32 34 43
5 2015 Exp17 IBM 32 34 46
6 2015 Exp18 LEN 32 54 67
6 2015 Exp20 LEN 67 56 76
6 2015 Exp21 LEN 45 56 65
7 2015 Exp19 SCL 56 6 4 45 56
7 2015 Exp22 SCL 45 55 54
2014 Exp3 LEN 2 34 34
2015 Exp12 IBM 1 33 4 5
2015 Exp15 IBM 23 4 5
2015 Exp23 SCL 4 55 45
내가 시도한 것은 다음과 같습니다.
awk ' NR>1{ for (i=4;i<=NF;i++) if ($i!="") arr1[$1,$2,$3]=$i ; next }
$1,$2,$3 in arr1 {
for (j=1;j<length(arr1);j++))
{if (arr1[j] > 20)
group++;
END {
for (j in n) {
print group, arr1[j]
}
}' input input
답변1
실제 데이터 형식과 기타 질문을 기반으로 한 임의의 팁...
데이터 필드는 어떻게 구분되나요? (처음 세 개의 공백은 중간에 탭이 있는 것처럼 느껴지고 마지막 열은 공백으로 구분된 것처럼 보입니다.) 필드 구분 기호가 기본적으로 정의된 경우 4-N 열의 열은 정보가 손실됩니다. 따라서 코드 논리에 심각한 결함이 있습니다.
당신이 가지고 있다면아니요awk
TAB 구분 기호를 사용하지만 모든 공백은 GNU 의 기능을 사용하여 액세스할 수 있습니다 FIELDWIDTHS
(얻으려고 하는 것처럼 누락된 "공백" 데이터 포함).
처음 세 개의 구분 기호에 탭이 있고 나머지 구분 기호에 공백이 있는 경우 FS="\t"
필드 1-3을 직접 처리하고 최종 데이터에서 전체 공백을 유지할 수 있도록 이를 명시적으로 정의해야 합니다(필드 4가 처리될 때 전체적으로 처리할 수 있음). )) "빈 데이터"를 쉽게 찾을 수 있도록 합니다.
데이터의 하위 집합을 동적으로 생성하고 해당 하위 집합에 대해 작업한 다음 개별 하위 집합을 조인하면 처리가 더 쉬워질 수 있습니다. 파일의 데이터를 분리하려면 다음 사항에 따라 달라집니다.년도그리고악기당신은 쓸 수 있습니다:
awk '{ print > "set_" $1 "_" $3" }' input
set_2015_LEN
예를 들어 이름이 지정 되거나 set_2014_IBM
해당 항목을 포함하는 파일이 생성됩니다 .
"일치하는 숫자 열 집합"을 식별하는 최종 작업은 앞서 언급한 주제에 따라 다릅니다. 예를 들어 마지막 8번째 데이터 열을 고정 길이 엔터티로 처리할 수 있는 경우 sort
적절하게 정의된 키 사양이 있는 유틸리티를 사용하면 충분합니다( sort
옵션 참조 -k
).
(BTW: 복합 인덱스 테스트의 경우 를 $1,$2,$3 in arr1
작성해야 합니다 ($1,$2,$3) in arr1
.)