2015-02-23 63 views
0

我有一个长度未知的文本文件。有两个值在每一行:Bash脚本:按行编辑.txt

VALUE1[SPACE]VALUE2 

现在我已经得到另一个(或相同)有了这样一个新的列表文件:

0.0.0.0/rep/com/bla/blub/VALUE1/VALUE2/VALUE1-VALUE2.zip 

...每行我都在列出两个值。我怎样才能做到这一点?

回答

1

这是awk的一个很好的用例(更新照顾括号中):

awk -F" " '{ gsub("\\(", "", $1); gsub("\\)", "", $2);print "0.0.0.0/rep/com/bla/blub/"$1"/"$2"/"$1"-"$2".zip"}' test.txt > yournewfile.txt 

这将每行分裂以空格,更换开口括号中的第一令牌$1并在第二托克$2更换右括号,然后在它们各自的令牌$1和使用值0您输出的字符串为print

+0

这只适用于第一个值集或不是?我需要逐行进行编辑,以获得每行与此行的值的链接:/ – xsus 2015-02-23 15:24:44

+0

这将遍历输入文件中的每一行,并在输出文件中创建一个新行。 – JNevill 2015-02-23 20:53:10

+0

请取消删除[您最近的SQL答案](http://stackoverflow.com/a/28683389/57611)。对于除OP之外的其他人仍然有帮助(只要清楚它只能在SQL Server 2012及更高版本中运行)。 – ErikE 2015-02-23 21:28:16

0

我假设VALUE1VALUE2不包含空格,否则第一个定义变得模糊。有了这个假设,您可以使用cut在第一空间分割线构成filename变量使用字符串插值:

cat txt-File | while read VALUE1 VALUE2 _; do 
    filename="0.0.0.0/rep/com/bla/blub/$VALUE1/$VALUE2/$VALUE1-$VALUE2.zip" 

    # Do something with filename... 
    stat "$filename" 
done 
+0

'while read VALUE1 VALUE2 _;做...完成 tripleee 2015-02-23 14:56:53

+0

uff,你可以简化这个:'cat file |虽然'没有必要,你可以说'while ... done fedorqui 2015-02-23 14:56:54

+0

我更喜欢领先的'cat file',因为它明确了循环处理的内容,而不必滚动到底部。修正了另一件事。 – 2015-02-23 15:00:45

0

输入数据文件的格式为(VALUE1 VALUE2).。你先删除初始(,和后者).有很多方法可以做到这一点,这里是一个

sed 's/(//g' yourfile | sed 's/).//g' 

然后,您可以通过这个交给awk。这里$1对应于第一列,并$2到第二:

sed 's/(//g' yourfile | sed 's/).//g' | awk '{print "0.0.0.0/rep/com/bla/blub/"$1"/"$2"/"$1"-"$2".zip"}' 
+0

但当我这样做,它只能在一行或? – xsus 2015-02-23 15:23:16

+0

它适用于所有行。 – swalog 2015-02-23 15:27:16

+0

我建议你自己尝试一下;-) – swalog 2015-02-23 15:29:01

0

我会用sed此:

sed $'s,^[ \t]*\([^ \t]*\)[ \t][ \t]*\([^ \t]*\).*$,0.0.0.0/rep/com/bla/blub/\1/\2/\1-\2.zip,' filename >new-filename 

如果您愿意加入-i.bak您可以修改,以取代原有的文件: sed -i.bak $'s, ... ,'