如何解决为什么文件中最后一条记录出现空双引号?壳| 对上面命令的逐条解释
我有 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","S"
为什么将第二行作为最后一个条目 -> ""
-> "P",""
当它们在文件 2 中只有四个值时,应该是:"P","S"
这是因为文件 2 中的空行最终导致的吗?
解决方案将不胜感激
解决方法
我认为它确实来自一个空行。您可以通过以下方式消除此类“错误”
更新您的脚本以包含 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。