【发布时间】:2015-02-23 14:45:13
【问题描述】:
我有一个长度未知的文本文件。每行有两个值:
VALUE1[SPACE]VALUE2
现在我必须获取另一个(或相同)文件,其中包含一个新列表,例如:
0.0.0.0/rep/com/bla/blub/VALUE1/VALUE2/VALUE1-VALUE2.zip
...对于列表中包含两个值的每一行。我该怎么做?
【问题讨论】:
标签: bash shell ubuntu scripting
我有一个长度未知的文本文件。每行有两个值:
VALUE1[SPACE]VALUE2
现在我必须获取另一个(或相同)文件,其中包含一个新列表,例如:
0.0.0.0/rep/com/bla/blub/VALUE1/VALUE2/VALUE1-VALUE2.zip
...对于列表中包含两个值的每一行。我该怎么做?
【问题讨论】:
标签: bash shell ubuntu scripting
这是 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 和$2 中使用值在您使用print输出的字符串中
【讨论】:
我假设VALUE1 和VALUE2 不包含空格,否则第一个定义会变得模棱两可。有了这个假设,您可以使用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
【讨论】:
while read VALUE1 VALUE2 _; do ... done <file 会避免烦人的外部流程,并且会更加地道。
cat file | while不是必须的,你可以说while ... done < file。此外,read 可以通过说 while read value1 value2 ... 来读取多个参数
cat file,因为它使循环正在处理的内容一目了然,而无需滚动到底部。修复了另一件事。
<file 放在循环的前面。会更清楚。
输入数据文件的格式是(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"}'
【讨论】:
我会为此使用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,...,' 来修改原始文件。
【讨论】: