다음 구조의 텍스트 파일이 있습니다.
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}
@1
mapdo
pprinl