저는 UNIX와 코딩 전반에 대해 처음 접했고 오랜 시간 동안 이 문제를 해결하려고 노력했지만 성공하지 못했습니다. 나는 이것이 매우 간단한 해결책이라고 확신하지만 누군가 나를 올바른 방향으로 안내해 줄 수 있다면 도움이 될 것입니다.
다음 형식의 데이터가 포함된 Summary.txt 파일이 있습니다.
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z
Sample12345.avg l m n
Sample12345.stdn o p q
Sample98765 w2 x2 y2 z2
Sample98765.avg l2 m2 n2
Sample98765.stdn o2 p2 q2
기타 등등
동일한 샘플 번호를 가진 세 줄을 결합하고 이름만 유지하고 싶습니다.
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z l m n o p q
Sample98765 w2 x2 y2 z2 l2 m2 n2 o2 p2 q2
기타 등등
예를 들어 sed를 사용해 보았습니다(먼저 모든 Sample12345.avg Sample12345.stdn 등을 포함하는 Summary_temp.txt를 만든 후).
for i in `cat Summary_temp.txt`; do sed 's/\n$i//g' Summary.txt; done
"-bash: 예상치 못한 토큰 'sed' 근처에 구문 오류가 발생했습니다."
나도 이 길로 가려고 노력했어
paste -sd ' ' Summary.txt | sed 's/\t/\n/g10; s/\t/@/g; s/\n/\t/g' | sed 's/.\nSample.*.avg//g' | head
내가 얻은 가장 가까운 것은 다음과 같습니다.
cat Summary.txt | sed 's/ *| */,/g;/^$/d' | paste -d, - - - | head
그러나 이것은 첫 번째 줄에서 시작하므로 모든 것이 마이너스 1입니다.
Name criteria1 2 3 4 5 6 7 8 9 10 Sample12345 w x y z Sample12345.avg l m n
Sample12345.stdn o p q Sample98765 w2 x2 y2 z2 Sample98765.avg l2 m2 n2
Sample98765.stdn o2 p2 q2 ETC ETC
head -1 Summary.txt > Summary_temp_3.txt
나중에 다시 추가할 수 있도록 시도해 보았습니다 .
sed '1d' Summary.txt > Summary_temp_4.txt
cat Summary_temp_4.txt | sed 's/ *| */,/g;/^$/d' |
paste -d, - - - | sed 's/,.*_by_name//g | head
이것은 전혀 아무것도 표시하지 않습니다. 결국 ctrl-C를 눌러야 하므로 오래 걸리지 않을 것이기 때문에 그것이 틀렸다고 가정합니다. 도와주세요. 저는 초보자이고 이것은 아마도 쉽게 해결할 수 있는 어리석은 문제일 것이라는 것을 알고 있지만, 무엇을 더 시도해야 할지 모르겠습니다.
답변1
특별히 우아하지는 않지만 두 번째에서 마지막 줄( 2,$
) 의 경우 N
ext 줄과 N
ext 줄을 패턴 공간으로 가져온 다음 g
개행 문자 뒤의 공백이 아닌 시퀀스를 전역적으로 바꿉니다.
sed '
2,${
N
N
s/\n[^[:blank:]]*//g
}
' Summary.txt
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z l m n o p q
Sample98765 w2 x2 y2 z2 l2 m2 n2 o2 p2 q2
답변2
+ paste
방법 sed
은 다음과 같습니다(파일에 ,
문자가 없다고 가정).
$ paste -sd '\n,,' your-file | sed 's/,[^[:blank:]]*//g'
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z l m n o p q
Sample98765 w2 x2 y2 z2 l2 m2 n2 o2 p2 q2
답변3
입력 데이터가 일관적인 경우(예: 세 행마다 그룹의 첫 번째 행의 첫 번째 필드를 공유하는 경우) awk
다음과 같이 하나의 명령만 필요합니다.
awk '
NR==1{print;next}
NR%3==0{$1="";printf $0}
NR%3==1{$1="";printf $0;print ""}
NR%3==2{printf $0}
' infile
결과:
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z l m n o p q
Sample98765 w2 x2 y2 z2 l2 m2 n2 o2 p2 q2
답변4
사용행복하다(이전 Perl_6)
당신이 설명하는 것은 다음과 같이 가장 잘 표현됩니다.해시시, keys
고유한 상태로 유지되기 때문입니다. 해당 키-값 쌍이 없으면 추가 키-값 쌍이 해시에 새 쌍으로 추가되고 key
, 그렇지 않으면 동일한 이름을 가진 values
기존 키-값 쌍에 추가됩니다 . key
간단한 예를 들어보세요:
~$ raku -ne 'BEGIN my %h; %h.append: .split(" ", 2); END .put for %h.sort;' file
위의 코드는 간단한 첫 번째 열 "키"를 처리하고 행의 나머지 부분은 "값"이 됩니다. OP에서 제공하는 더 복잡한 데이터 세트의 경우 다음을 제거 .stdn
하고 .avg
확장해야 합니다.
~$ raku -ne 'BEGIN my %h; \
.split(/ \. <alpha>+ | \s+ /, :skip-empty) andthen \
%h.append(.[0] => .[1..*]); \
END .put for %h.sort;' file
더 자세히 설명하자면: Raku 코드는 -ne
자동 인쇄되지 않는 한 줄씩 플래그를 사용하여 실행됩니다. 행을 반복하기 전에 BEGIN
해시를 선언합니다. %h
그런 다음 행은 split
켜져 있거나 \. <alpha>+
(예: ".avg" 또는 ".stdn") \s+
비어 있습니다. 분할 후 키-값 쌍을 사용하여 다시 로드 $_
한 andthen
다음 해시합니다 . "굵은 화살표" 구문은 키-값 쌍을 의미/생성합니다 . 예를 들어 첫 번째 열(색인 = )은 가 되고 나머지(색인 = ) 요소는 가 됩니다 .append
%h
=>
.[0] => .[1..*]
0
key
1..*
values
입력 예:
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z
Sample12345.avg l m n
Sample12345.stdn o p q
Sample98765 w2 x2 y2 z2
Sample98765.avg l2 m2 n2
Sample98765.stdn o2 p2 q2
출력 예(키와 값 사이에 Tab 키를 누름):
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z l m n o p q
Sample98765 w2 x2 y2 z2 l2 m2 n2 o2 p2 q2
마지막으로, CSV 파일의 출력을 사용하려면 join
모든 요소를 쉼표로 묶으면 됩니다(단일 값 포함). 전체 답변은 다음과 같습니다.
~$ raku -ne 'BEGIN my %h; \
.split(/ \. <alpha>+ | \s+ /, :skip-empty) andthen \
%h.append(.[0] => .[1..*]); \
END put .keys ~ "," ~ .values.map: *.join(",") for %h.sort;' file
Sample98765,w2,x2,y2,z2,l2,m2,n2,o2,p2,q2
Sample12345,w,x,y,z,l,m,n,o,p,q
Name,criteria1,2,3,4,5,6,7,8,9,10
코드를 다시 확인하려면 다음을 변경하세요.
.values.map: *.join(",")
도착하다.values.map: *.elems
value
키당 10개의 열 수를 반환합니다 .
Name,10
Sample12345,10
Sample98765,10