使用shell脚本转换文件内容



大家好,我是shell编码的初学者。在日常工作中,我需要将文件的数据转换为另一种格式,我通常使用文本编辑器手动完成。但我经常犯错。所以我决定编写一个简单的脚本,谁可以为我做这项工作。文件的内容类似于此

/release201209
a1,a2,"a3",a4,a5
b1,b2,"b3",b4,b5
c1,c2,"c3",c4,c5

到此:

a2>a3
b2>b3
c2>c3

脚本应忽略第一行,并打印由">"分隔的第二个和第三个值

我已经到了一半,这是我的代码

#!/bin/bash
#while Loops
i=1
while IFS=" read t1 t2 t3
do
test $i -eq 1 && ((i=i+1)) && continue
echo $t1|cut -d, -f2 | { tr -d 'n'; echo >$t2; } 
done < $1 

我的代码中的问题是,除非文件以空行结束,否则最后一行不会打印。\n我希望回声打印在一个新的CSV文件中(我试图将标准输出设置为我的新文件,但只有最后一个回声打印在那里(。有人能帮帮我吗?提前谢谢。

与其将双引号视为字段分隔符,不如删除它们(假设这是有效的(。例如:

$ < input tr -d '"'  | awk 'NR>1{print $2,$3}' FS=, OFS=>
a2>a3
b2>b3
c2>c3

如果你不能像你的示例输入中那样去掉引号,但这些引号是转义逗号的,你可以想出一个解决方案,但最好使用合适的CSV解析工具。(例如perl的文本::CSV(

这里有一个简单的管道可以完成任务:

sed '1d' data.txt | cut -d, -f2-3 | tr -d '"' | tr ',' '>'

在这里,我们只是删除第一行(根据需要(,选择字段2&3(基于逗号字段分隔符(,删除双引号并将剩余的,映射到>

使用这个Perl单行:

perl -F',' -lane 'next if $. == 1; print join ">", map { tr/"//d; $_ } @F[1,2]' in_file

Perl单行使用以下命令行标志:
-e:neneneba告诉Perl在线查找代码,而不是在文件中查找代码
-n:一次循环输入一行,默认情况下将其分配给$_
-l:在线执行代码之前,剥去输入行分隔符(默认情况下*NIX上的"n"(,并在打印时附加
-a:在空白处或在-F选项中指定的regex上将$_拆分为数组@F
-F',':按逗号拆分为@F,而不是按空格拆分。

另请参阅:
perldoc perlrun:如何执行Perl解释器:命令行切换

相关内容

  • 没有找到相关文章

最新更新