4

我正在尝试制作一个用于文本编辑的脚本。在这种情况下,我有一个名为 text.csv 的文本文件,内容如下:

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

我应该使用什么命令来实现这一点?

4

4 回答 4

6

我会在 awk 中执行此操作。

假设您的第一行应该有 a;而不是 a ,

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

未经测试。

于 2012-08-07T01:22:40.590 回答
2

这是一个纯 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
于 2012-08-07T01:26:48.923 回答
1

awk -v FS=';' -v OFS=';' '{for (i = 2; i <= NF; ++i) { print $1, $i }}' 说明: awk 隐式地将数据拆分为记录(默认情况下由换行符分隔,即行 == 记录),然后通过给定的字段分隔符(FS用于输入字段分隔符和OFS输出分隔符)将其拆分为编号字段。对于每条记录,此脚本会打印第一个字段(即记录名称)以及第 i 个字段,这正是您所需要的。

于 2012-08-07T01:25:59.940 回答
1
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。真是让我长知识了。。

于 2012-08-07T04:18:22.737 回答