我有这样的文件:
1 a,b,c
2 z
3 d,f
并希望有这种格式:
1 a
1 b
1 c
2 z
3 d
3 f
答案1
awk解决方案:
$ cat file
1 a,b,c
2 z
3 d,f
$ awk '{ gsub(",", "\n"$1" "); print; }' file
1 a
1 b
1 c
2 z
3 d
3 f
答案2
如果您的输入像看起来一样简单,那么这里有一个bash
shell 脚本,它可以完成 shell 脚本不擅长的事情:
#!/usr/bin/env bash
declare -a col2
while read col1 rest
do
IFS=, read -a col2 <<< "$rest"
for value in ${col2[*]}
do
printf "%s %s\n" "$col1" "$value"
done
done < input
有更好的方法可以做到这一点(read -a
是 bash 特定的,而不是 POSIX);还有其他方法可以做到这一点(awk、perl)。如果您的数据更加复杂(1 a,"b,c",d)
,(1 a,b\,c,d)
那么此脚本可能不会执行您想要的操作。
答案3
请尝试一下:
sild@:/tmp $ cat test
1 a,b,c
2 z
3 d,f
sild@:/tmp $ cat test.sh
#!/bin/bash
separator=","
cat test | while read line; do
head="`echo $line | cut -d" " -f1`"
IFS="$separator" read -ra nodes <<< "`echo $line | cut -d" " -f2-`"
for i in "${nodes[@]}"; do
echo $head $i
done
done
sild@:/tmp $ ./test.sh
1 a
1 b
1 c
2 z
3 d
3 f
sild@:/tmp $
答案4
Perl解决方案:
perl -ane 'print map "$F[0] $_\n" ,split(",",$F[1])' file
1 a
1 b
1 c
2 z
3 d
3 f