stackoverflow.csv文件中的示例数据我有:
foo
foo
foo
foo
bar
bar
bar
bar
baz
baz
baz
baz
我知道sed -n /foo/p stackoverflow.csv > foo.csv
我将获得与foo相匹配的所有记录,但我不想在cli上指定匹配模式,我宁愿将其放在脚本中并拥有所有记录(foo,bar和baz)发送到他们自己的档案。
基本上这是在剧本中:
sed -n /foo/p stackoverflow.csv > foo.csv
sed -n /bar/p stackoverflow.csv > bar.csv
sed -n /baz/p stackoverflow.csv > baz.csv
像这样:
#!/bin/sh
sleep 2
sed -n /foo/p > foo.csv
sed -n /bar/p > bar.csv
sed -n /baz/p > baz.csv
这会创建文件,但它们全部为空。 此外,如果脚本只有一个print语句,它就可以工作。
任何输入?
答案 0 :(得分:3)
您错过了输入文件名
#!/bin/sh
sleep 2
sed -n /foo/p stackoverflow.csv > foo.csv
sed -n /bar/p stackoverflow.csv > bar.csv
sed -n /baz/p stackoverflow.csv > baz.csv
您可以将输入文件作为参数提供给脚本,在这种情况下,请更改脚本以读取参数并将其传递给sed
命令。
像这样运行脚本:./script.sh input_filename
,您可以在其中指定不同的输入文件作为参数。
#!/bin/sh
file=${1}
sed -n /foo/p ${file} > foo.csv
sed -n /bar/p ${file} > bar.csv
sed -n /baz/p ${file} > baz.csv
答案 1 :(得分:1)
w
中的sed
命令允许您写入命名文件。
sed -n -e '/foo/wfoo.csv' -e '/bar/wbar.csv' \
-e '/baz/wbaz.csv' stackoverflow.csv
并非所有sed
方言都接受多个-e
个参数;由换行符分隔的命令的多行字符串可能是最便携的解决方案。
sed -n '/foo/wfoo.csv
/bar/wbar.csv
/baz/wbaz.csv' stackoverflow.csv
这只会检查一次输入文件,并在文件继续写出匹配的行。
要创建一个接受一个或多个文件名作为参数的脚本,请将硬编码的文件名替换为"$@"
。
#!/bin/sh
sed -n ... "$@"
答案 2 :(得分:0)
这是一个在循环中使用grep的解决方案,您不需要提前提供每个术语。假设有一个bash shell:
for i in $(sort stackoverflow.csv | uniq); do grep $i testfile > $i; done