3

linux新手,并试图以艰难的方式逃避这种做法。我有一个文件(“output.txt”),其中包含“查找”命令的结果。“output.txt”中的前三行示例:

/home/user/temp/LT50150292009260GNC01/L5015029_02920090917_MTL.txt
/home/user/temp/LT50150292009276GNC01/L5015029_02920091003_MTL.txt
/home/user/temp/LT50150292009292GNC01/L5015029_02920091019_MTL.txt

我想使用 awk 或 sed (或类似的)从为每一行列出的路径中提取两个部分,并输出到一个新文件(“run.txt”),并在每一行上添加额外的信息,如下所示:

cd /home/user/temp/LT50150292009260GNC01; $RUNLD L5015029_02920090917_MTL.txt
cd /home/user/temp/LT50150292009276GNC01; $RUNLD L5015029_02920091003_MTL.txt
cd /home/user/temp/LT50150292009292GNC01; $RUNLD L5015029_02920091019_MTL.txt

我猜这也可能涉及“剪切”之类的东西,但我无法理解如何考虑更改文件夹和文件名。

任何帮助将非常感激。

4

5 回答 5

1
sed -e 's/^/cd /; s|/\([^/]*\)$|; \$RUNLD \1|' file

这会添加“cd”并将最后一个 / 替换为“; $RUNLD”。瞧!

于 2012-05-07T19:29:07.803 回答
1

只用 bash

while IFS= read -r filename; do
  printf 'cd %s; $RUNLD %s\n' "${filename%/*}" "${filename##*/}"
done < output.txt > run

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

于 2012-05-07T19:45:08.497 回答
0

我可能会使用基于循环的 grep 解决方案来解决这个问题,因为我不知道cut,或者awk很好哈哈。这可以解决问题:

while read x; do folder=$(echo "$x" | grep -o '^.*/'); file=$(echo "$x" | grep -o '[^/]*$'); echo "cd ${folder:0:-1}; \$RUNLD $file"; done < output.txt > run
于 2012-05-07T19:13:04.807 回答
0
sed 's|^|cd |; s|/\([^/]*\)$|; $RUNLD \1|' inputfile > run

它说:

  • 在行首插入“cd”
  • 对于最后一个斜线和后面的内容,替换为“; $RUNLD”和最后一部分(由括号捕获)
于 2012-05-07T19:28:21.073 回答
0

这可能对您有用:

sed 's/\(.*\)\//cd \1; $RUNLD /' file
cd /home/user/temp/LT50150292009260GNC01; $RUNLD L5015029_02920090917_MTL.txt
cd /home/user/temp/LT50150292009276GNC01; $RUNLD L5015029_02920091003_MTL.txt
cd /home/user/temp/LT50150292009292GNC01; $RUNLD L5015029_02920091019_MTL.txt
于 2012-05-07T23:01:36.920 回答