여러 텍스트 파일의 열을 복사하고 새 파일의 첫 번째 줄에 파일 이름을 추가하여 데이터 세트를 구성하고 싶습니다. 내 데이터 예는 다음과 같습니다.
파일 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에서 시작하는 네 번째 열마다 인쇄합니다 .printf
cut
paste
cat
awk
1st
output1
2nd
output2
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"
}'