为什么空双引号在最后一条记录中出现在文件中 | shell |

why empty double quote is coming in file at last record | shell |

我有 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 }' )`

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 最后有空行?

解决方案将不胜感激

我假设它确实来自空行。您可以通过以下方式删除此类 'mistakes' 更新您的脚本以包含 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') 后续命令(这称为 'pipeline'):

| 

下一个命令通过替换换行符来连接 'stdin' 的行 使用 , 个分隔符(默认情况下,分隔符将是一个制表符):

paste -s -d, 

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

| 

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

sed 's/,""$//' 

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

>> /path/consolidate.txt