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

おすすめ記事