Awk Shell脚本:如何分割行?
这是我的简历: 我的输入文件如下:Awk Shell脚本:如何分割行?,awk,sed,split,grep,Awk,Sed,Split,Grep,这是我的简历: 我的输入文件如下: /tmp/abc.txt /tmp/cde.txt /tmp/xyz/123.txt 我想在2个文件中获得以下输出: 第一档 /tmp/ /tmp/ /tmp/xyz/ 第二档 abc.txt cde.txt 123.txt 非常感谢通过grep grep -o '.*/' file > file1.txt grep -o '[^/]*$' file > file2.txt */匹配从开始到最后一个/符号的所有字符 [^/]*$匹配任何字
/tmp/abc.txt
/tmp/cde.txt
/tmp/xyz/123.txt
我想在2个文件中获得以下输出:
第一档
/tmp/
/tmp/
/tmp/xyz/
第二档
abc.txt
cde.txt
123.txt
非常感谢通过grep
grep -o '.*/' file > file1.txt
grep -o '[^/]*$' file > file2.txt
匹配从开始到最后一个*/
符号的所有字符/
匹配任何字符,但不匹配[^/]*$
的零次或多次/
断言我们在一行的末尾$
- 这里是一个完整的
awk
awk -F\/ -vOFS=\/ '{print $NF > "file2";$NF="";print > "file1"}' input
这里我们将输入和输出分隔符设置为/
然后将最后一个字段
$NF
打印到文件2
将最后一个字段设置为nothing,然后将其余字段打印到
文件1
我知道您已经有了答案,但您可能对以下两个命令感兴趣:
basename
dirname
如果它们在您的系统上可用,您将能够通过以下管道获得您想要的:
cat input | xargs -l dirname > file1
cat input | xargs -l basename > file2
享受吧
编辑:根据quantdev的评论修复。接得好 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_脚本测试文件
下面是另一个使用
tee
:cat f1.txt | tee>(xargs-n1 dirname>>f2.txt)>(xargs-n1 basename>>f3.txt)和>/dev/random说
删除最后一个字段
是误导性的,因为您只删除了文本。该字段仍然存在,如果删除该字段,则最后一个/
将消失;do dirname“$a”>>f2.txt;basename“$a”>>f3.txt;完成cat input | xargs -l dirname > file1
cat input | xargs -l basename > file2
#n sed script to get base and file paths
h
s/.*\/\(.*.txt\)/\1/
w file1
g
s/\(.*\)\/.*.txt/\1/
w file2