为什么空双引号在最后一条记录中出现在文件中 | 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
我有 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