私は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