Shell脚本:如何分割线?

时间:2014-11-29 12:04:57

标签: awk sed split grep

这是我的scanerio:

我的输入文件如:

/tmp/abc.txt
/tmp/cde.txt
/tmp/xyz/123.txt

我希望在2个文件中获得以下输出:

第一个文件

/tmp/
/tmp/
/tmp/xyz/

第二档

abc.txt
cde.txt
123.txt

非常感谢

5 个答案:

答案 0 :(得分:4)

以下是一个awk

awk -F\/ -vOFS=\/ '{print $NF > "file2";$NF="";print > "file1"}' input

cat file1
/tmp/
/tmp/
/tmp/xyz/

cat file2
abc.txt
cde.txt
123.txt

这里我们将输入和输出分隔符设置为/
然后将最后一个字段$NF打印到file2
将最后一个字段设置为空,然后将其余字段打印到file1

答案 1 :(得分:1)

我意识到你已经有了答案,但你可能对以下两个命令感兴趣:

basename
dirname

如果您的系统上有可用的产品,那么您将能够获得您想要的产品:

cat input | xargs -l dirname > file1
cat input | xargs -l basename > file2

享受!

编辑:修正了每个quantdev的评论。好抓!

答案 2 :(得分:0)

通过grep,

grep -o '.*/' file > file1.txt
grep -o '[^/]*$' file > file2.txt
  • .*/匹配从开头到最后/符号的所有字符。
  • [^/]*$匹配任何字符,但不匹配/零次或多次。 $声称我们处于一条线的尽头。

答案 3 :(得分:0)

awk解决方案可能是最好的,但这是一个纯sed解决方案:

#n sed script to get base and file paths
h
s/.*\/\(.*.txt\)/\1/
w file1
g
s/\(.*\)\/.*.txt/\1/
w file2

注意我们如何使用h保存缓冲区,以及我们如何使用write(w)命令生成输出文件。使用sed还有很多其他的方法,但我喜欢这个使用多个不同的命令。 使用它:

  

> sed -f sed_script testfile

答案 4 :(得分:0)

这是使用tee的另一个oneliner:

cat f1.txt | tee >(xargs -n 1 dirname >> f2.txt) >(xargs -n 1 basename >> f3.txt) &>/dev/random