나는 성공하지 못한 채 한동안 다음을 시도했습니다.
내가 받은 데이터에는 각 개별 열에 쉼표로 구분된 값이 있습니다. 열 6의 쉼표 앞의 첫 번째 값은 항상 열 7의 쉼표 앞의 첫 번째 값과 관련됩니다. 데이터를 추출하여 다음과 같이 올바른 순서로 테이블에 넣고 싶습니다.
입력 데이터:
1 2 3 4 5 A1,A2 B1,B2
1 7 3 3 5 C1,C2,C3 D1,D2,D3
1 2 R 4 b E1,E2,E3,E4 G1,G2,G3,G4
출력 데이터:
1 2 3 4 5 A1 B1
1 2 3 4 5 A2 B2
1 7 3 3 5 C1 D1
1 7 3 3 5 C2 D2
1 7 3 3 5 C3 D3
1 2 R 4 b E1 G1
1 2 R 4 b E2 G2
1 2 R 4 b E3 G3
1 2 R 4 b E4 G4
나는 그것들을 정렬된 배열에 넣기 전에 분리해야 한다는 것을 알고 있지만 \t
, 나는 이것에 완전히 익숙하지 않고 엄청난 양의 데이터를 받습니다.
답변1
그리고 awk
:
awk '{split($6,a,","); split($7,b,","); for(i in a){print $1,$2,$3,$4,$5,a[i],b[i]}}' file
awk
입력 공간 또는 탭으로 구분하여 읽습니다. 기본값:[\t ]+
.split($6,a,",")
6번째 필드를$6
쉼표로 구분하고,
출력을 이름이 지정된 배열에 저장합니다a
.split($7,b,",")
$7
일곱 번째 필드를 쉼표로 구분하고,
출력을 이름이 지정된 배열에 저장합니다b
.for(i in a)
이제 배열을 반복하십시오a
...print ...,a[i],b[i]
...그리고 해당 값을 해당 인덱스 와 함께 두 배열 값$1
에 모두 인쇄합니다 .$5
a[i]
b[i]
i
산출:
1 2 3 4 5 A1 B1
1 2 3 4 5 A2 B2
1 7 3 3 5 C1 D1
1 7 3 3 5 C2 D2
1 7 3 3 5 C3 D3
1 2 R 4 b E1 G1
1 2 R 4 b E2 G2
1 2 R 4 b E3 G3
1 2 R 4 b E4 G4
답변2
사용행복하다(이전 Perl_6)
~$ raku -ne 'my @split1 = .split(/ \s+ /);
my @split2 = @split1.[5..*].map: .split(",");
for [Z] @split2 { put (@split1[0..4], $_).join("\t") };' file.txt
Raku는 Perl 계열의 프로그래밍 언어입니다. CSV
복잡한 CSV 파일(여러 줄 헤더, 삽입된 줄바꿈 등)을 처리할 수 있는 모듈이 있습니다 . 위는 외부 모듈을 로드하지 않은 답변입니다.
-ne
코드는 (비자동 인쇄, 한 줄씩) 플래그를 통해 파일을 한 줄씩 읽도록 지시합니다. 첫 번째는 split
공백을 분리하여 배열을 만듭니다 @split1
. 5개의 "데이터" 열이 각 행의 시작 부분에 제공되므로 s를 s 의 마지막 "공변" 열 (이번에는 쉼표로 구분) 배열로 [0..4]
생성하는 두 번째 명령문에서는 인덱스가 무시됩니다 .map
split
[5..*]
@split1
,
@split2
접두사 [Z]
Zip 축소 연산자는 @split2
배열의 각 요소를 제거하여 요소를 효과적으로 전치합니다(합이 인접하도록 A1
등 B1
). 마지막으로 put
"데이터" 열과 "공변" 열이 나란히 있는 행이 나오고 join
필요에 따라 편집합니다.
입력 예:
1 2 3 4 5 A1,A2 B1,B2
1 7 3 3 5 C1,C2,C3 D1,D2,D3
1 2 R 4 b E1,E2,E3,E4 G1,G2,G3,G4
예제 출력:
1 2 3 4 5 A1 B1
1 2 3 4 5 A2 B2
1 7 3 3 5 C1 D1
1 7 3 3 5 C2 D2
1 7 3 3 5 C3 D3
1 2 R 4 b E1 G1
1 2 R 4 b E2 G2
1 2 R 4 b E3 G3
1 2 R 4 b E4 G4
https://docs.raku.org/routine/split
https://docs.raku.org/언어/operators#Reduction_metaoperators
https://raku.org