使用shell脚本编辑文本格式

问题描述:

我想为文本编辑做一个脚本。在这种情况下,我有一个名为text.csv一个文本文件,其内容为:使用shell脚本编辑文本格式

first;48548a;48954a,48594B 
second;58757a;5875b 
third;58756a;58576b;5867d;56894d;45864a 

我想使文本格式是这样的:

first;48548a 
first;48954a 
first;48594B 
second;58757a 
second;5875b 
third;58756a 
third;58576b 
third;5867d 
third;56894d 
third;45864a 

什么是命令我应该使用来实现这一目标?

+2

[你有什么尝试](http://whathaveyoutried.com)? – jordanm 2012-08-07 01:14:08

+0

在你的第一行输入数据中,最后一个分隔符应该是逗号还是分号?或者你是否愿意接受*或者*字符作为分隔符? (答案可能会影响工具如何分割你的数据。) – ghoti 2012-08-07 01:18:32

+0

嗨乔丹,我只是尝试使用awk命令,但我知道如何使它发生,所以我问我应该使用什么命令..:D ..感谢您的帮助 – adhown 2012-08-07 02:40:07

我会在awk中这样做。

假设你的第一行应该有一个;代替,

$ awk -F\; '{for(n=2; n<=NF; n++) { printf("%s;%s\n",$1,$n); }}' input.txt 

未经检验。

awk -v FS=';' -v OFS=';' '{for (i = 2; i <= NF; ++i) { print $1, $i }}' 说明:AWK隐含地分割数据为记录(默认情况下由换行separeted,即线==记录),然后被分成由下式给出字段分隔符(FS为输入字段分隔符和OFS用于输出分离器)编号字段。 对于每个记录,该脚本都会打印第一个字段(这是记录名称)以及第i个字段,而这正是您需要的。

这是一个纯粹的bash解决方案,可同时处理,;

while IFS=';,' read -a data; do 
    id="${data[0]}" 
    data=("${data[@]:1}") 
    for item in "${data[@]}"; do 
     printf '%s;%s\n' "$id" "$item" 
    done 
done < input.txt 

更新 - 基于chepner的建议替代打印方法:

while IFS=';,' read -a data; do 
    id="${data[0]}" 
    data=("${data[@]:1}") 
    printf "$id;%s\n" "${data[@]}" 
done < input.txt 
+0

或'printf'$ id;%s \ n“”$ {data [@]}“';不需要for循环。 – chepner 2012-08-07 02:06:57

+0

@chepner - 这是一个很好的建议。我通常不喜欢在printf的格式字符串中扩展变量,但它确实保存了一个循环。 – jordanm 2012-08-07 02:10:05

while IFS=';,' read -a data; do 
    id="${data[0]}" 
    data=("${data[@]:1}") 
    printf "$id;%s\n" "${data[@]}" 
done < input.txt 

awk -v FS=';' -v OFS=';' '{for (i = 2; i <= NF; ++i) { print $1, $i }}' 

而且

$ awk -F\; '{for(n=2; n<=NF; n++) { printf("%s;%s\n",$1,$n); }}' input.txt 

谢谢大家的建议,:d。这真的给了我一个新的知识..

+1

如果您要回答自己的问题,则应包含尚未发布为答案的内容。而不是重新发布答案,你应该upvote他们,并选择一个“接受”。请阅读[FAQ](http://stackoverflow.com/faq)。 – jordanm 2012-08-07 15:10:25