유사한 줄을 재정렬하는 awk 스크립트

유사한 줄을 재정렬하는 awk 스크립트

약 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 열의 열은 정보가 손실됩니다. 따라서 코드 논리에 심각한 결함이 있습니다.

당신이 가지고 있다면아니요awkTAB 구분 기호를 사용하지만 모든 공백은 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.)

관련 정보