3

私は大きなファイルの1つを持っています

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

ここで 1 列目の foo、bar、qux などはファイル名です。2列目43、51、34などは行番号です。各ファイル(1列目で指定)のN行目(2列目で指定)を印刷したい。UNIXシェルで上記を自動化するにはどうすればよいですか。実際には、コンパイル中に上記のファイルが生成され、コードに警告行を出力したいと考えています。

-ありがとう、

4

6 に答える 6

2
while IFS=: read name line rest
do
    head -n $line $name | tail -1
done < input.txt
于 2012-04-13T14:46:18.640 に答える
2

while IFS=: read file line message; do
    echo "$file:$line - $message:"
    sed -n "${line}p" "$file"
done <yourfilehere
于 2012-04-13T16:48:50.607 に答える
0
 sed -nr '3{s/^([^:]*):([^:]*):.*$/\1 \2/;p}' namesNnumbers.txt 
 qux 34
  • -nデフォルトでは出力なし、
  • -r正規表現(parensの使用を簡略化)
  • 3行目で{...;p}を実行します(最後に印刷します)
  • sfoobarbazをfooバーに置き換えます

したがって、値を操作するには:

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

fn=$(echo ${fnUln/ */})
ln=$(echo ${fnUln/* /})
sed -n "${ln}p" "$fn"
于 2012-04-13T17:21:29.957 に答える
0

ちょうどawkですが、おそらく@kevまたは@MarkReedによる回答よりもパフォーマンスが劣ります。ただし、各ファイルは1回だけ処理されます。GNUawkが必要です

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)
        }
    }
'
于 2012-04-13T17:21:59.503 に答える
0
awk 'NR==4 {print}' yourfilename

or

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

上記はファイルの4行目で機能します。必要に応じて番号を変更できます。

于 2012-04-13T14:45:05.603 に答える
0

これはあなたのために働くかもしれません:

sed 's/^\([^,]*\),\([^,]*\).*/sed -n "\2p" \1/' file |
sort -k4,4 | 
sed ':a;$!N;s/^\(.*\)\(".*\)\n.*"\(.*\)\2/\1;\3\2/;ta;P;D' |
sh
于 2012-04-13T18:22:30.847 に答える