열을 복사하고 파일 이름을 열 헤더로 사용

열을 복사하고 파일 이름을 열 헤더로 사용

여러 텍스트 파일의 열을 복사하고 새 파일의 첫 번째 줄에 파일 이름을 추가하여 데이터 세트를 구성하고 싶습니다. 내 데이터 예는 다음과 같습니다.

파일 1

a   a   b   b
1   2   3   4

파일 2

c   d   e   f
g   h   i   g

. . .

파일 3

11  12  23  12
2   4   6   7

페론

n1  n2  n3  n4
nn  nm  no  np

내가 원하는 출력은 데이터 파일에서 해당 열을 수집하여 4개의 데이터 파일을 생성하는 것입니다.

출력 1

file1   file2   file3   filen
a   c   11  n1
1   g   2   nn

출력 2

file1   file2   file3   filen
a   d   12  n2
2   h   4   nm

출력 3

file1   file2   file3   filen
b   e   23  n3
3   i   6   no

출력 4

file1   file2   file3   filen
b   f   12  n4
4   g   7   np

다음을 사용하여 4개의 필수 파일을 복사하고 정리할 수 있었습니다.

awk 'FNR==1{f++}{a[f,FNR]=$1}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output1
awk 'FNR==1{f++}{a[f,FNR]=$2}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output2
awk 'FNR==1{f++}{a[f,FNR]=$3}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output3
awk 'FNR==1{f++}{a[f,FNR]=$4}END{for(x=1;x<=FNR;x++){for(y=1;y<ARGC;y++)printf("%s ",a[y,x]);print ""}}' file* > output4

그러나 출력 파일의 첫 번째 줄에 파일 이름을 추가할 수는 없습니다.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

이미 출력 파일이 있고 각 파일에 파일 이름이 포함된 헤더를 추가해야 하는 경우 필요한 것은 다음과 같습니다.

header=$(printf "%s %s %s %s\n" $(awk 'FNR==1{print FILENAME}' file*))
for file in output*; do 
    printf '%s\n%s\n' "$header" "$(cat $file)" > tmp && 
    mv tmp "$file"; 
done

답변2

파일을 에코하고 awk처리된 데이터를 사용하세요.

paste <( echo file1 ; awk '{print $1}' file1 )\
      <( echo file2 ; awk '{print $1}' file2 ) #and so on

괄호 안의 명령은 입력으로 전달되기 전에 자체 하위 쉘에서 실행됩니다.paste

답변3

나는 다음과 같이 모든 작업을 수행합니다. +를
사용하여 헤더, 파일 내용을 인쇄하고 두 결과를 연결한 다음 파이프를 사용하여 1에서 시작하는 네 번째 열마다 , 1에서 시작하는 네 번째 열마다 인쇄합니다 .printfcutpastecatawk1stoutput12ndoutput2

for f in file*
do
printf " ${f}%.0s" 1 2 3 4
done | cut -c2- | cat - <(paste file*) | awk '{
for (i=1;i<=NF;i+=4){printf "%s ",$i >"output1"} ;print "" >"output1"
for (i=2;i<=NF;i+=4){printf "%s ",$i >"output2"} ;print "" >"output2"
for (i=3;i<=NF;i+=4){printf "%s ",$i >"output3"} ;print "" >"output3"
for (i=4;i<=NF;i+=4){printf "%s ",$i >"output4"} ;print "" >"output4"
}'

관련 정보