在foreach循环中使用grep或sed将不起作用

时间:2014-02-26 13:05:03

标签: variables foreach sed grep csh

我花了无数个小时试图完成这项工作,我认为是时候寻求帮助了。我有一个2列文件 - 让我们称之为“result.txt”,其中包含如下值的列表:

fileA.ext  -10.3 
fileB.ext  -9.8
fileC_1.ext  -9.7
fileC_2.ext -9.5
fileD.ext  -9.4
fileC_3.ext -9.3

我想为每种文件类型仅使用唯一结果重新创建此列表,因此它应如下所示:

fileA.ext  -10.3 
fileB.ext  -9.8
fileC_1.ext  -9.7
fileD.ext  -9.4

我创建了一个文件列表,可以通过使用grep或sed提取包含匹配文件的第一行来完成此操作:

fileA
fileB
fileC
fileD

我们称之为result2.txt

我试图编写以下c-shell脚本:

foreach l (`cat result2.txt`)
    set name = "$l"
    echo "$name"
    grep -m1 "$name" result.txt >> result3.txt
end

输出文件“result3.txt”为空。该脚本完美地运行到grep命令。当我在循环外运行grep命令时,使用result2.txt中的一行,它工作正常。我使用此结果获得相同的结果:sed -n '/"\$name\"/p' 我想我在某个时候尝试过awk命令。 问题似乎在于让这些程序识别$name$l变量。我尝试了$name左右的“和”的不同组合,我尝试添加反斜杠:例如$\name。有人可以告诉我这是什么问题吗? 感谢

3 个答案:

答案 0 :(得分:2)

听起来像awk的工作。使用下划线或空格作为字段分隔符,并仅在尚未看到第一个字段时打印一行:

awk -F '[_[:space:]]+' '!seen[$1]++' << END
fileA.ext -10.3
fileB.ext -9.8
fileC_1.ext -9.7
fileC_2.ext -9.5
fileD.ext -9.4
fileC_3.ext -9.3
END
fileA.ext -10.3
fileB.ext -9.8
fileC_1.ext -9.7
fileD.ext -9.4

答案 1 :(得分:0)

我刚刚尝试过CSH,您的版本和以下简化版本都可以使用。注意,根本没有引号。

foreach name (`cat result2.txt`)
    grep -m1 $name result.txt >>result3.txt
end

请您检查result.txt是否真的包含您在开头提到的内容?

cat result.txt

答案 2 :(得分:0)

sed -n 's/.*/²&³/;H
$ {x;s/\(.\).*/&\1/
t again
: again
   s/²\([^_]\{1,\}_\)\(.*\)\²\1[^³]*³./²\1\2/
   t again
   s/.\(.*\)./\1/;s/[²³]//g
   p
   }' YourFile

由于\ n操作中的限制,使用2个临时分隔符²³