Excel 채우기 기능과 유사한 텍스트 파일의 열을 "채우는" 명령

Excel 채우기 기능과 유사한 텍스트 파일의 열을 "채우는" 명령

해당 행 내의 행과 열을 포함하는 텍스트 파일이 있습니다. 기본적으로 Excel의 "채우기" 기능을 복제하고 싶습니다. 즉, 행에 빈 "셀"이 있는 경우 그 위의 행을 찾아 위의 해당 필드의 값으로 채웁니다. 예를 들어 열 구분 기호로 "^"를 사용합니다.

London^Paris^Moscow^Berlin
^^Melbourne^New York^Washington
^^^Sydney^Singapore^New Delhi
^^New York^Washington
Kuala Lumpur^Bangkok^Hong Kong
^^^^Johannesburg^Sydney^Singapore^New Delhi
Amsterdam
^^Bucharest

...다음과 같습니다(명확성을 위해 항목을 대문자로 입력).

London^Paris^Moscow^Berlin
LONDON^PARIS^Melbourne^New York^Washington
LONDON^PARIS^MMELBOURNE^Sydney^Singapore^New Delhi
LONDON^PARIS^New York^Washington
Kuala Lumpur^Bangkok^Hong Kong
KUALA LUMPUR^BANGKOK^HONG KONG^^Johannesburg^Sydney^Singapore^New Delhi
Amsterdam
AMSTERDAM^^Bucharest

따라서 기본적으로 이 기능은 빈 필드를 식별하고, 빈 필드가 있으면 그 위의 해당 필드에서 값을 가져오는 것입니다. 필드/열 구분 기호를 지정할 수 있는 것이 중요합니다. 어떤 아이디어가 있나요?

답변1

awk -F'^' -v OFS='^' \
   '{
        for (i = 1; i <= NF; i++) {
                if ($i == "") $i = save[i]
                else          save[i] = $i
        }
        for (i = NF+1; i <= 99; i++) save[i] = ""
        print
    }'

save 이는 한 행에서 다음 행까지 값을 유지하기 위해 호출되는 배열을 사용합니다 (아래로 채우기). 의 모든 내용은 awk암시적으로 null로 초기화되므로 save데이터가 배열에 할당될 때까지 배열은 비어 있습니다. (따라서 첫 번째 행의 빈 필드는 복사할 이전 데이터가 없기 때문에 공백으로 유지됩니다.)

각 행에 대해

  • 행 ( ) for (i = 1; i <= NF; i++)에 있는 각 필드 에 대해
    • 비어 있으면 해당 열의 저장된(복사된) 값으로 채우고,
    • 그렇지 않으면 후속 행에서 사용하기 위해 현재 값을 저장합니다.
  • 그런 다음 save현재 행에 존재하지 않는 모든 열의 배열을 지웁니다. 예를 들어, 4개 필드만 있는 4행에 도달하면 3행의 5열과 6열에 "Singapore"와 "New Delhi"가 포함되어 있다는 사실을 "잊습니다". 7행(필드가 하나만 있음)에 도달하면 5행의 2열에 "Bangkok"이 포함되어 있으므로 8행(2열이 비어 있음)을 입력할 수 없다는 사실을 "잊습니다".

    99 한 행에 표시될 것으로 예상되는 최대 필드 수로 바꿉니다 .

관련 정보