awk
첫 번째 줄에는 매개변수 이름이 있고 다음 줄에는 값이 포함된 테이블이 포함된 파일이 있습니다. 또는 쉘 스크립트 유틸리티를 사용하여 다음을 수행하는 방법 sed
:
fileXX
각 줄의 이름이 지정된 구성 파일을 생성합니다.- 생성된 각 구성 파일의 각 열 값을 한 줄(행)로 바꿉니다.
- 각 파일에서 매개변수 이름을 나타내는 첫 번째 행을 전치된 열 값에 연결하여 매개변수 이름-값 쌍으로 표시합니다.
소스 파일:
Column1 Column2 Column3
Row1_Col1 Row1_Col2 Row1_Col3
Row2_Col1 Row2_Col2 Row2_Col3
Row3_Col1 Row3_Col2 Row3_Col3
결과물 파일:
파일 1
Column1=Row1_Col1 Column2=Row1_Col2 Column2=Row1_Col3
파일 2
Column1=Row2_Col1 Column2=Row2_Col2 Column2=Row2_Col3
파일 3
Column1=Row3_Col1 Column2=Row3_Col2 Column2=Row3_Col3
답변1
엄격한 입력 유효성 검사가 포함된 명령이 내장된 GNU datamash
(새로운 명령줄 프로그램)를 사용할 수 있습니다 .transpose
예:
$ cat in.txt
Column1 Column2 Column3
Row1_Col1 Row1_Col2 Row1_Col3
Row2_Col1 Row2_Col2 Row2_Col3
Row3_Col1 Row3_Col2 Row3_Col3
$ datamash transpose < in.txt
Column1 Row1_Col1 Row2_Col1 Row3_Col1
Column2 Row1_Col2 Row2_Col2 Row3_Col2
Column3 Row1_Col3 Row2_Col3 Row3_Col3
그런 다음 열로 나눕니다 cut
.
$ datamash transpose < in.txt | cut -f1,3 | tr '\t' '='
Column1=Row2_Col1
Column2=Row2_Col2
Column3=Row2_Col3
여러 파일을 생성하려면 다음 명령을 사용할 수 있습니다.
for i in 2 3 4 ; do
datamash transpose < in.txt | cut -f1,$i | tr '\t' '=' > file$i.txt
done
GNU Datamash는 여기에서 구할 수 있습니다:http://www.gnu.org/s/datamash, 패키지는 여러 gnu/linux 배포판에서 사용할 수 있습니다(면책조항: 저는 datamash
개발자입니다).
답변2
awk를 사용하여 이 작업을 수행할 수 있습니다.
{
# extract files names form first line
if (1 == NR) {
num_fields = NF
for(i = 1; i <= num_fields ; i++)
{
# get line header
header[i] = $i
# create file name
file[i] = "file-"i
}
}
else
{
# extract data if not first line
for (i = 1; i <= num_fields; i++)
{
print header[i] ":" $i > file[i]
}
}
}
다음을 통해 호출하세요.
awk -f script.awk file_to_process
답변3
src=/the/source/file
set -- `head -1 $src`;
col1=$1 ; col2=$2 ; col3=$3; i=0;
grep -v "`head -1 $src`" $src | while read c1 c2 c3
do
echo -e "$col1=$c1\n$col2=$c2\n$col3=$c3" > file-$((i=i+1)).out ;
done
시험
$ cat $src
Column1 Column2 Column3
Row1_Col1 Row1_Col2 Row1_Col3
Row2_Col1 Row2_Col2 Row2_Col3
Row3_Col1 Row3_Col2 Row3_Col3
$ set -- `head -1 $src`; i=0; col1=$1 ; col2=$2 ; col3=$3; i=0; grep -v "`head -1 $src`" $src | while read c1 c2 c3 ; do echo -e "$col1=$c1\n$col2=$c2\n$col3=$c3\n" > file-$((i=i+1)).out ; done
$ cat file-1.out
Column1=Row1_Col1
Column2=Row1_Col2
Column3=Row1_Col3
$ cat file-2.out
Column1=Row2_Col1
Column2=Row2_Col2
Column3=Row2_Col3
$ cat file-3.out
Column1=Row3_Col1
Column2=Row3_Col2
Column3=Row3_Col3
$