2012-04-13 68 views
3

后,我有我的大文件中的一个作为得到文件第N行解析另一个文件

foo:43:sdfasd:daasf
bar:51:werrwr:asdfa
qux:34:werdfs:asdfa
foo:234:dfasdf:dasf
qux:345:dsfasd:erwe
...............

这里第一列富,酒吧和qux等都是文件名。第二列43,51,34等是行号。我想打印每个文件的第N行(由第2列指定)(在第1列中指定)。 如何在unix shell中自动执行上述操作。 实际上面的文件是在编译时生成的,我想在代码中打印警告行。

-Thanks,

回答

0
awk 'NR==4 {print}' yourfilename 

or 

cat yourfilename | awk 'NR==4 {print}' 

以上人会在你的file.You第4行的工作可以改变号码按您的要求。

+0

通过行号:'AWK -vn = $ LINENO 'NR == N {打印;出口}' file' – 2012-04-13 17:07:08

+0

如果该文件正在处理另一个中间,那么我们应该使用-v选项。但如果它是一个明确的过程,那么我们不需要-v选项。 – Teja 2012-04-13 18:15:22

2
while IFS=: read name line rest 
do 
    head -n $line $name | tail -1 
done < input.txt 
+0

如果您只想要有问题的行:'head -n $ line $ name | tail -1' – 2012-04-13 17:05:37

+0

@glennjackman谢谢 – kev 2012-04-13 17:07:48

2

while IFS=: read file line message; do 
    echo "$file:$line - $message:" 
    sed -n "${line}p" "$file" 
done <yourfilehere 
+1

提高效率:'sed -n“' – 2012-04-13 17:06:11

+0

这是一个很好的做法,可以在更改IFS之前保存IFS并在恢复到原始状态后更长的需要。像:'OFS = $ IFS; ...; IFS = $ OFS' – vyegorov 2012-04-13 19:04:30

+0

vyegorov:上述内容仅在读取命令期间更改。即使在循环体内,它也回到了默认值。 – 2012-04-13 21:21:09

0
sed -nr '3{s/^([^:]*):([^:]*):.*$/\1 \2/;p}' namesNnumbers.txt 
qux 34 
  • -n默认情况下没有输出,
  • -r正则表达式(简化使用括号)在第3行
  • 做{... ; p}(打印在结尾处)
  • sf与foo酒吧foobarbaz

所以与价值观工作:

fnUln=$(sed -nr '3{s/^([^:]*):([^:]*):.*$/\1 \2/;p}' namesNnumbers.txt) 

fn=$(echo ${fnUln/ */}) 
ln=$(echo ${fnUln/* /}) 
sed -n "${ln}p" "$fn" 
+0

问题是询问如何将第34行从文件“qux”中删除(并且对所有其他行都是类似的) – 2012-04-13 18:18:39

+0

@glennjackman:我知道。使用“qux”和“34”很简单:'sed -n“$ {lineno} p”“$ filename”'。你认为我应该在我的回答中包括这个? – 2012-04-13 18:33:03

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) 
     } 
    } 
' 
0

这可能会为你工作:

sed 's/^\([^,]*\),\([^,]*\).*/sed -n "\2p" \1/' file | 
sort -k4,4 | 
sed ':a;$!N;s/^\(.*\)\(".*\)\n.*"\(.*\)\2/\1;\3\2/;ta;P;D' | 
sh 
相关问题