【问题标题】:why empty double quote is coming in file at last record | shell |为什么最后一条记录出现空双引号?贝壳 |
【发布时间】:2021-06-05 14:19:37
【问题描述】:

我有 10 个文件,其中包含一个柱状垂直数据,我将这些数据转换为合并一个文件 以水平形式显示数据

文件 1:

A
B
C
B

文件 2:

P
W
R
S

文件 3:

E
U
C
S

与上面类似,它们将保留文件

我使用以下脚本合并了所有文件

cd /path/

#storing all file names to array_list to club data of all into one file 
array_list=`( awk -F'/' '{print $2}' )`

for i in {array_list[@]}
do 
   sed 's/"/""/g; s/.*/"&"/' /path/$i | paste -s -d, >> /path/consolidate.txt
done 

从上述脚本获得的输出:

"A","B","C","B"
"P","W","R","S",""
"E","U","C","S"

为什么第二行是最后一个条目 -> "" -> "P","W","R","S",""

当它们在文件 2 中只有四个值时,应该是:"P","W","R","S"

最后是因为那个文件 2 中的空行吗?

解决方案将不胜感激

【问题讨论】:

    标签: shell unix text-processing


    【解决方案1】:

    我认为它确实来自一个空行。您可以通过以下方式消除此类“错误” 更新您的脚本以包含 sed 's/,""$//',例如:

    sed 's/"/""/g; s/.*/"&"/' /path/$i | paste -s -d, | sed 's/,""$//' >> /path/consolidate.txt
    

    上面命令的解释,一段一段

    用一个双引号替换两个双引号(g 选项意味着这样做 每一行的每一场比赛,而不仅仅是第一场比赛):

    sed 's/"/""/g; 
    

    我们使用分号告诉 sed 我们将发出另一个命令。下一个 sed 的替换命令匹配整行,并将其替换为自身, 但用双引号括起来(& 表示匹配的模式):

    s/.*/"&"/' 
    

    这是上面 sed 命令的一个参数,扩展了变量i for 循环:

    /path/$i 
    

    上面的命令产生一些输出('stdout'),默认情况下是 发送到终端。取而代之的是,我们将其用作输入('stdin') 后续命令(这称为“管道”):

    | 
    

    下一个命令通过替换换行符来加入 'stdin' 的行 使用, 定界符(默认定界符是制表符):

    paste -s -d, 
    

    我们将最后一个命令的“stdout”通过管道传递给另一个命令(继续 管道):

    | 
    

    下一个命令是另一个 sed,这次替换任何出现的 ,"" 发生在行尾(在 sed 中,$ 表示行尾) 什么都没有(实际上是删除匹配的模式):

    sed 's/,""$//' 
    

    上述管道的输出被附加到我们的文本文件中(>> appends, 而> 覆盖):

    >> /path/consolidate.txt
    

    【讨论】:

    • 感谢您的解决方案,您能否描述上述整个命令实际上它在做什么,这将对所有其他用户有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    相关资源
    最近更新 更多