2012-04-13 64 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 
相關問題