두 번째 행부터 시작하여 3개 행마다 그룹화하고 결합된 두 번째 행과 세 번째 행에서 첫 번째 열을 제거합니다.

두 번째 행부터 시작하여 3개 행마다 그룹화하고 결합된 두 번째 행과 세 번째 행에서 첫 번째 열을 제거합니다.

저는 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,$) 의 경우 Next 줄과 Next 줄을 패턴 공간으로 가져온 다음 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..*]0key1..*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

https://docs.raku.org/언어/hashmap
https://raku.org

관련 정보