大家好,我是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解释器:命令行切换