고정 너비 문서가 있습니다. 예는 다음과 같습니다.
0196969696645001200 1100450000000000TEST1 / TECHNOLOTEST 97827Y
0196969696645001500 1100450000000000TEST222 EXPRESS - CMTEST 97827Y
0196969696600701325 7003150000000000TEST33333 70215U
0196969696621055400 1476210000000000TEST44444SE - CMC AUERSTEST 97803Y
메타데이터 파일 예:
COL1,1,2
COL2,3,19
COL3,22,27
COL4,28,33
COL5,34,37
COL6,38,40
COL7,78,81
문제 설명: 각 열의 메타데이터 파일(시작 및 끝 위치)을 읽고 고정 너비 파일을 참조하여 각 열에 대한 파일을 생성합니다.
내 코드:
feed_file=$1
metadata_file=$2
if [ $# -lt 2 ]
then
echo "Insufficient Number of Parameters passed"
echo "Usage <FEED FILE NAME> <META DATA FILE NAME>"
exit 1
fi
#Read metadata file and create feed file for each attribute
while read line
do
attrib_name=`echo $line | cut -d "," -f1`
beg_point=`echo $line | cut -d "," -f2`
end_point=`echo $line | cut -d "," -f3`
echo "$attrib_name || $beg_point || $end_point"
range=$beg_point-$end_point
cat $feed_file | cut -c $range > $attrib_name
done < $metadata_file
Error: cut: bad list for c option
답변1
텍스트를 처리하기 위해 쉘 루프를 사용하지 마십시오, 다음과 같은 텍스트 처리 도구를 사용하십시오 awk
.
awk -F, '
!meta_done{start[$1] = $2; len[$1] = $3 - $2 + 1; next}
{for (i in start) print substr($0, start[i], len[i]) > i}
' "$meta_file" meta_done=1 "$feed_file"
이는 제한이 $meta_file
있으며 변수 할당처럼 구성 $feed_file
할 수 없습니다 . awk
와 같은 이름의 파일이 있는 경우 대신 에 meta=data.txt
전달해야 합니다 ../meta=data.txt
awk
meta=data.txt