我有一个大文件
foo:43:sdfasd:daasf
bar:51:werrwr:asdfa
qux:34:werdfs:asdfa
foo:234:dfasdf:dasf
qux:345:dsfasd:erwe
...............
这里第一列foo,bar和qux等是文件名。第二列43,41,34等是行号。我想为每个文件打印第N行(由第2列指定)(在第1列中指定)。 如何在unix shell中自动执行上述操作。 实际上上面的文件是在编译时生成的,我想在代码中打印警告线。
-Thanks,
答案 0 :(得分:2)
while IFS=: read name line rest
do
head -n $line $name | tail -1
done < input.txt
答案 1 :(得分:2)
while IFS=: read file line message; do
echo "$file:$line - $message:"
sed -n "${line}p" "$file"
done <yourfilehere
答案 2 :(得分:0)
awk 'NR==4 {print}' yourfilename
or
cat yourfilename | awk 'NR==4 {print}'
上述内容适用于您文件中的第4行。您可以根据自己的要求更改数字。
答案 3 :(得分:0)
sed -nr '3{s/^([^:]*):([^:]*):.*$/\1 \2/;p}' namesNnumbers.txt
qux 34
所以要使用值:
fnUln=$(sed -nr '3{s/^([^:]*):([^:]*):.*$/\1 \2/;p}' namesNnumbers.txt)
fn=$(echo ${fnUln/ */})
ln=$(echo ${fnUln/* /})
sed -n "${ln}p" "$fn"
答案 4 :(得分:0)
只是在awk中,但可能比@kev或@MarkReed的答案更差。 但它只会处理每个文件一次。需要GNU awk
gawk -F: '
BEGIN {OFS=FS}
{
files[$1] = 1
lines[$1] = lines[$1] " " $2
msgs[$1, $2] = $3
}
END {
for (file in files) {
split(lines[file], l, " ")
n = asort(l)
count = 0
for (i=1; i<=n; i++) {
while (++count <= l[i])
getline line < file
print file, l[i], msgs[file, l[i]]
print line
}
close(file)
}
}
'
答案 5 :(得分:0)
这可能对您有用:
sed 's/^\([^,]*\),\([^,]*\).*/sed -n "\2p" \1/' file |
sort -k4,4 |
sed ':a;$!N;s/^\(.*\)\(".*\)\n.*"\(.*\)\2/\1;\3\2/;ta;P;D' |
sh