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 를 한 행에 표시될 것으로 예상되는 가장 많은 수의 필드로 바꿉니다 .

관련 정보