텍스트를 표 형식으로 변환

텍스트를 표 형식으로 변환

다음 구조의 텍스트 파일이 있습니다.

aaa
bbb
ccc
ddd
eee
fff

1
2
3
4
5
6

1.1
1.2
1.3
1.4
1.5
1.6

ggg
hhh
iii
jjj
kkk
lll

7
8
9
10
11
12

2.1
2.2
2.3
2.4
2.5
2.6

다음과 같은 테이블 구조를 원합니다.

aaa    1    1.1
bbb    2    1.2
ccc    3    1.3
ddd    4    1.4
eee    5    1.5
fff    6    1.6
ggg    7    2.1
hhh    8    2.2
iii    9    2.3
jjj    10   2.4
kkk    11   2.5
lll    12   2.6

이 예에서는 패턴이 열당 2번 반복되지만 실제 파일은 더 많이 반복하고 더 많은 필드를 갖습니다.

답변1

paste일을 할 수 있어야 합니다. x.1파일 이름 입니다

paste <(grep -E '^[[:alpha:]]+$' x.1) \
      <(grep -E '^[[:digit:]]+$' x.1) \
      <(grep -E '^[[:digit:]]+[.][[:digit:]]+$' x.1) 

답변2

다음을 수행할 수 있습니다.

mkfifo 0 1 2
awk -v RS= '{print > NR%3}' < file & paste 1 2 0

다음 중 하나라도 해당되면 교착 상태가 발생할 수 있습니다.파이프 버퍼(Linux의 경우 64k)보다 큽니다.

답변3

1) 알파벳, 2) 정수, 3) 부동 소수점 및 4) 영숫자의 네 가지 유형의 데이터를 고려하면 다음 awk스크립트가 작업을 수행할 수 있습니다.

/^[a-zA-Z]+$/ {
    alphabets[ia++] = $1;
    n++;
}

/[a-zA-Z]+[0-9]+[a-zA-Z0-9]*/ || /[0-9]+[a-zA-Z]+[a-zA-Z0-9]*/ {
    alphanumerics[an++] = $1;
}

/[0-9]+[.][0-9]+/ {
    floats[f++] = $1;
}

/^[0-9]+$/ {
    integers[k++] = $1;
}    

END {
    for (i = 0; i < n; i++) {
        print alphabets[i], integers[i], floats[i], alphanumerics[i];
    }
}

위의 코드를 파일(예: )에 저장하고 table.awk다음과 같이 실행합니다.

awk -f table.awk input_text_file

특히, 위의 "데이터 유형" 블록은 입력 파일에서 어떤 순서로든 나타날 수 있습니다. 샘플 데이터와 6개의 영숫자 값을 사용하여 얻은 출력은 다음과 같습니다.

aaa 1 1.1 a1
bbb 2 1.2 b2
ccc 3 1.3 c3
ddd 4 1.4 d4
eee 5 1.5 e55
fff 6 1.6 6fF
ggg 7 2.1 
hhh 8 2.2 
iii 9 2.3 
jjj 10 2.4 
kkk 11 2.5 
lll 12 2.6 

답변4

단일 TXR Lisp 표현식, 고차 함수 및 부분 애플리케이션 기반 파이프라인, 고정 너비 필드 형식 지정을 위한 준 리터럴 문자열 사용:

$ txr -e '[(opip (partition* @1 (op where (op equal "")))
                 (tuples 3)
                 (reduce-left (op mapcar append))
                 (apply mapdo (op pprinl `@{1 6} @{2 6} @{3 6}`)))
           (get-lines)]' < data
aaa    1      1.1
bbb    2      1.2
ccc    3      1.3
ddd    4      1.4
eee    5      1.5
fff    6      1.6
ggg    7      2.1
hhh    8      2.2
iii    9      2.3
jjj    10     2.4
kkk    11     2.5
lll    12     2.6

어떻게 작동하나요?

일반적으로 전체 표현은 형태를 갖습니다 [function argument]. is , 스트림에서 행을 가져와 (게으른) 문자열 목록을 반환합니다 argument. (get-lines)스트림의 기본값은 매크로에 의해 *stdin*구성되며 여기에서 모든 작업이 발생합니다.function(opip ...)

이해하다opip, 우리는 알아야 한다op, opip이는암묵적으로: "파이프라인"을 나타냅니다 op). 또한 op일부 장소에서는 명시적으로 사용됩니다. 간단히 말해서 를 호출 하고 일부 매개변수를 처리하는 (op function args ...)익명 함수를 생성하기 위한 구문 설탕입니다 . function에서는 args ...익명 함수에 대한 인수를 숫자로 참조할 수 있습니다. 익명 함수는 암시적으로 후행 매개변수도 허용합니다. 예를 들어, (op + 3)인수를 합산하고 3을 더하는 익명 함수를 나타냅니다. (op - @1 3)인수에서 3을 빼는 익명 함수입니다. 이 구문은 @1함수의 첫 번째 매개변수를 표현식의 지정된 위치에 삽입하는 것을 의미합니다. (op mapcar append)는 각각 목록을 포함하는 여러 목록을 전달할 수 있는 함수입니다. 이 함수는 이러한 목록을 튜플로 가져와 함께 추가합니다. 이는 데이터 결합을 위한 붙여넣기 같은 논리의 기초입니다.

opip매크로는 여러 표현식을 가져와 연결한 op다음 결과 익명 함수를 통해 데이터를 파이프하는 함수를 만듭니다. 이것은 단순화된 것이지만 그렇게 될 것입니다.

(partition* @1 (op where (op equal "")))equal요소가 빈 줄(빈 문자열)인 목록을 잘라내고 이러한 항목을 제거하여 파일의 원래 줄 목록을 파티션으로 나눕니다. ( 이름에 partition하나가 없는 함수는 *이러한 공백을 유지합니다).

(tuples 3)이 파티션을 3개의 그룹으로 나눕니다.

이러한 3개의 그룹 또는 트리플은 병렬로 함께 누적되어야 합니다. 트리플의 첫 번째 요소는 단일 목록에 추가되어야 하고, 두 번째 요소는 단일 목록에 추가되어야 하는 식입니다. 그게 직업이에요 (reduce-left (op mapcar append)). 커널 함수에는 (op mapcar append)한 쌍의 트리플이 제공되며 해당 항목을 함께 연결하여 병합된 트리플을 만듭니다. 이것reduce-left이 함수는 이를 통해 트리플 목록을 단일 트리플로 줄입니다.

mapdo그런 다음 이 기본 트리플은 최종 표현식의 호출에 대한 인수로 적용됩니다 (apply mapdo (op pprinl ...)). 다음에 의해 다시 생성된 mapdo함수를 가장 왼쪽 인수로 받습니다 . (op ...)나머지 매개변수는 세 개의 데이터 열을 나타내는 거대 삼중항의 세 요소입니다. 익명 함수를 통해 열을 행별로 매핑합니다.

익명 함수는 준 리터럴 문자열에서 참조되는 세 개의 인수를 사용하며 평균 필드 너비는 6으로 설정됩니다 `@{1 6} @{2 6} @{3 6}`. 이 문자열 준 리터럴은 익명 함수가 전달하는 3개의 인수(트리플에서 쌍으로 가져온 3개의 요소) 를 삽입하여 문자열을 구성하며 , 이는 개행 문자로 인쇄합니다.@{1 6}@1mapdopprinl

관련 정보