我花了无数个小时试图完成这项工作,我认为是时候寻求帮助了。我有一个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
。有人可以告诉我这是什么问题吗?
感谢
答案 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个临时分隔符²
和³