저는 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