bash:逐行读取文件并sed以追加

bash:逐行读取文件并sed以追加,bash,sed,while-loop,Bash,Sed,While Loop,我有一个文本文件,可以有X个字段,每个字段用逗号分隔。在我的脚本中,我逐行阅读,检查该行中填充了多少字段,并确定需要在该行末尾附加多少逗号来表示所有字段。例如,文件如下所示: Address,nbItems,item1,item2,item3,item4,item5,item6,item7 2325988023,7,1,2,3,4,5,6,7 2327036284,5,1,2,3,4,5 2326168436,4,1,2,3,4 应该是这样的: Address,nbItems,item

我有一个文本文件,可以有X个字段,每个字段用逗号分隔。在我的脚本中,我逐行阅读,检查该行中填充了多少字段,并确定需要在该行末尾附加多少逗号来表示所有字段。例如,文件如下所示:

Address,nbItems,item1,item2,item3,item4,item5,item6,item7    
2325988023,7,1,2,3,4,5,6,7
2327036284,5,1,2,3,4,5
2326168436,4,1,2,3,4
应该是这样的:

Address,nbItems,item1,item2,item3,item4,item5,item6,item7
2325988023,7,1,2,3,4,5,6,7
2327036284,5,1,2,3,4,5,,
2326168436,4,1,2,3,4,,,
我下面的脚本工作正常,但似乎效率极低。是逐行阅读对大文件有困难吗?是sed导致了经济放缓吗?这样做更好吗

#!/bin/bash

lineNum=0
numFields=`head -1 File.txt | egrep -o "," | wc -l`

cat File.txt | while read LINE
do
        lineNum=`expr 1 + $lineNum`
        num=`echo $LINE | egrep -o "," | wc -l`
        needed=$(( numFields - num ))
        for (( i=0 ; i < $needed ; i++ ))
        do
                sed -i "${lineNum}s/$/,/" File.txt
        done
done
#/bin/bash
lineNum=0
numFields=`head-1 File.txt | egrep-o“,”wc-l`
cat File.txt |读取行时
做
lineNum=`expr 1+$lineNum`
num=`echo$LINE | egrep-o“,”wc-l`
需要=$((numFields-num))
对于((i=0;i<$needed;i++)
做
sed-i“${lineNum}s/$/,/”File.txt
完成
完成

这类事情通常最好使用
awk
之类的语言来完成,例如:

awk 'NR==1{n=NF}{$n=$n}1' FS=, OFS=, file

下面是一个完整的
bash
解决方案

(
    IFS=","
    read hdrLine
    echo "$hdrLine"
    read -a header <<< "$hdrLine"
    numFields="${#header[@]}"

    while read -a line; do
        pad=${#line[@]}
        while (( pad < numFields )); do
            line[pad++]=
        done
        echo "${line[*]}"
    done
) < File.txt > newFile.txt
mv newFile.txt File.txt
(
IFS=“,”
读hdrLine
echo“$hdrLine”

阅读-标题哇,非常感谢。它不仅完美地实现了我的目标,而且非常简单和快速!+1 Scrumnizer优雅的解决方案一如既往,-Akshaythanks供您输入,但它实际上没有实现我的目标。从我所能看到的,它只是在每一行后面加上一个逗号,即使不需要,即所有字段都是e已经考虑到了。这就是我没有首先测试的原因。我不能发誓,我最近读到,如果你分配给一个更大的索引,数组将充满中间插槽。我想知道我在想什么,因为它看起来肯定不是
bash
!我会留下这个答案,看看我是否能挽救它;其他我会删除的。