Unix 플랫 파일의 원하는 위치에 구분 기호 설정

Unix 플랫 파일의 원하는 위치에 구분 기호 설정

저는 Unix 쉘 스크립팅의 초보자입니다. 나는 거대한 텍스트 파일을 가지고 있습니다. 100,000개가 넘는 레코드가 있고 각 줄이 거의 600자라고 가정해 보겠습니다. 내 요구 사항은 필요한 위치에 따라 구분 기호를 배치하여 플랫 파일을 csv 형식으로 변환하는 것입니다.

샘플 파일 1.txt

1234567890
9876543210

구분 기호 위치: [1,3,5,9]

예상 출력

1,23,45,6789,0
9,87,65,4321,0

아래 코드를 시도했는데 1.cfg와 3개의 레코드를 사용할 때 작동합니다.

1.cfg 내용:

4
2
1

그러나 구성 파일에서 4개의 구분 기호(6 4 2 및 1)가 있는 파일을 사용하면 레코드 번호 2(4)가 인쇄되지 않고 레코드가 6 2 및 1로 인쇄됩니다.

이것은 내 샘플 코드입니다.

j=`cat 1.cfg |wc -l`
echo "Total split" $j
counter=0
set -x
for i in `cat 1.cfg`
do
counter=`expr $counter + 1`
echo "Printing value of counter " $counter

# If there is only one field in the config file
        if [ "$j" = 1 ]
        then
                COMMAND_FINAL=`echo "sed -i 's/./&,/$i' 1.txt"`
                #COMMAND_FINAL=`echo "`sed -i 's/./&,/$i' 1.txt`"`
        fi
# If there are more than one fields in the config file and for first record generating the command
        if [[ "$counter" != "$j" && "$counter" = 1 ]]
        then
                COMMAND=`echo "sed -i 's/./&,/$i;"`
                #COMMAND=`echo "`sed -i 's/./&,/$i;"`
                echo "Value of COMMAND VARIABLE is" $COMMAND
# For the 2nd fields untill 2nd last field generating the command
        elif [[ "$counter" != "$j" && "$counter" != 1 ]]
        then
                COMMAND1=`echo "s/./&,/$i;"`
                COMMAND2=$COMMAND$COMMAND1
                echo "Value of command :" $COMMAND
                echo "Value of command1 :" $COMMAND1
                echo "Value of command2 :" $COMMAND2
                #echo "If i is not 1 and i is not last Printing middle records" $COMMAND2
# For the last field generating the command
        elif [[ "$counter" = "$j" && "$j" != 1 ]]
        then
                COMMAND3=`echo "s/./&,/$i' 1.txt"`
                #COMMAND3=`echo "s/./&,/$i' 1.txt"`
                COMMAND_FINAL=$COMMAND2$COMMAND3
                echo "Final Command is " $COMMAND_FINAL
        fi
done
set -x
echo "$COMMAND_FINAL" > execute.ksh
chmod 755 execute.ksh
./execute.ksh
echo "Executing the final command"

답변1

GNU awk 사용:

awk '{$1=$1}1' FIELDWIDTHS='1 2 2 4 1' OFS=',' file

또는 GNU sed를 사용하십시오:

sed -r 's/^(.{1})(.{2})(.{2})(.{4})(.{1})$/\1,\2,\3,\4,\5/' file 

산출:

1,23,45,6789,0
9,87,65,4321,0

바라보다:8개의 강력한 awk 내장 변수 – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

관련 정보