我正在尝试制作一个文本编辑脚本。在这种情况下,我有一个名为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
我应该使用什么命令来实现这一目标?
答案 0 :(得分:6)
我会在awk中这样做。
假设您的第一行应该有;
而不是,
:
$ awk -F\; '{for(n=2; n<=NF; n++) { printf("%s;%s\n",$1,$n); }}' input.txt
未测试。
答案 1 :(得分: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
答案 2 :(得分:1)
awk -v FS=';' -v OFS=';' '{for (i = 2; i <= NF; ++i) { print $1, $i }}'
说明:awk隐式地将数据拆分为记录(默认情况下由换行分隔,即行==记录),然后通过给定的字段分隔符(FS
用于输入字段分隔符和OFS
用于输出将其拆分为编号字段分隔器)。
对于每个记录,此脚本将打印第一个字段(即记录名称)以及第i个字段,这正是您所需要的。
答案 3 :(得分: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。这真的给了我一个新的知识..