这是我的scanerio:
我的输入文件如:
/tmp/abc.txt
/tmp/cde.txt
/tmp/xyz/123.txt
我希望在2个文件中获得以下输出:
第一个文件
/tmp/
/tmp/
/tmp/xyz/
第二档
abc.txt
cde.txt
123.txt
非常感谢
答案 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