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

标签 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,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

最佳答案

这种事情通常最好用awk这样的语言来完成,例如:

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

关于bash:逐行读取文件并使用 sed 追加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15161694/

相关文章:

Python "While"循环逻辑错误?

linux - 为自定义脚本创建 --help

arrays - Bash 脚本以特定的顺序或顺序显示结果

bash - 如何找到系列 : 2 3 4 6 9 13 19 28 42 63 . 中的第百万个数字 ..?

c - while 循环内的 If 语句无法执行并退出程序

java - 有人可以帮忙将这个 For 循环快捷方式转换为正常状态吗

bash - osx 星期一日期本周 bash

python - 使用 sed 编辑 PDF 属性

regex - sed - "{"和 "},"之间的地址空间

linux - 根据找到第一个模式找到一个模式并打印行 sed, awk grep