2013-02-25 15 views
0

我想使用程序基本名称(或某个其他程序)对使用空格分隔的数据中的一列中的每个字符串应用更改。具体而言,我有数据的形式如下列:使用命令替换和Bash实用程序编辑空格分隔数据中的字符串列

string string string /afs/address/user/directory1 string string string string 

我想改变的数据(在第四列中的字符串),以便它显示如下:

string string string directory1 string string string string 

这可能可以使用第四列每行的基本名称等程序来实现。我想要的解决方案将包含某种命令替换,以便可以在编辑列的每一行时使用基本名称以外的其他程序。因此,一些诸如以下可能会出现在该解决方案:

"$(basename $4)", 

其中$ 4代表列4行,我想我知道我会在每一行周期明确使用低效的代码,但我想有是一种使用类似awk的更高效的方法。你会对如何解决这个问题有任何建议吗?

回答

1
awk '{sub(/.*\//,"",$4)}1' file 
+0

谢谢您对此有帮助。如果我在做一些愚蠢的事情(原谅我不熟悉awk),请原谅我,但我在这方面遇到了一些困难。当我执行该命令时,会出现第二个关闭链括号中指示的语法错误。有什么显而易见的,我做错了吗? – d3pd 2013-02-25 15:48:40

+0

对不起,它错过了sub()命令的关闭“)”。我现在修好了。 – 2013-02-25 16:03:21

+0

啊,非常好。这是完美的。非常感谢! – d3pd 2013-02-25 18:07:06

1

ED的解决方案应该为你工作。

的情况下,你爱用basename

awk '{"basename "$4|getline $4}1' file 
+0

请注意,如果你这样做,那么你会暴露于globbing,分词,文件名扩展等,所以它可能会以非常神秘的方式失败,即使它返回,你回来可能看起来不像你开始的$ 4。 – 2013-02-25 15:18:05

+0

感谢您的帮助。如果我在做一些愚蠢的事情(原谅我不熟悉awk),请原谅我,但我在这方面遇到了一些困难。当我执行命令时,出现错误“sh:/ afs/address/user/directory1:没有这样的文件或目录”。你会碰巧知道发生了什么问题吗? – d3pd 2013-02-25 15:50:08

0

如果没有其他列包含一个斜线,你可以使用/作为字段分隔符并打印第一和最后一个字段:

awk -F/'{print $1 $NF}' <<< "string string string /afs/address/user/directory1 string string string string" 

输出

string string string directory1 string string string string 
相关问题