1

一部のデータをグラフとしてより適切に表現するために、いくつかの列を操作したいと思います。これまでのところ、すべてのデータがこのように並んでいます。最初の行はヘッダーで、次の 2 行はそのポイントの x データ、次に y データを保持しています。ファイル内のすべての番号は、1 つのタブで区切られています。このような:

200.023 468.865 567.976 647.711    ##this line is the 'header'
59.927  58.099  60.546  61.461     ##this line is x data
1576.77 2192.02 1630.22 1879.04    ##this line is y data
59.769  59.300  60.380  61.308     ##next x
1111.36 2674.2  1590.89 970.134    ##next y
##numbers continue down, and across the page

y 座標 (列 1 行 3) を取得し、タブで区切られた x (列 2 行 2) と同じ行に配置したいので、行の長さは 2 倍になります。ヘッダー行がずれないように、'"space" /t' のような簡単に識別できるものを追加する必要があると思いますが、何でも構いません。出力:

200.023 space   468.865 space   567.976 space   647.711 space
59.927  1576.77 58.099  2192.02 60.546  1630.22 61.461  1879.04
59.769  1111.36 59.300  2674.2  60.380  1590.89 61.308  970.134

何か明確にする必要がある場合はお知らせください。ありがとう

4

3 に答える 3

3

これにはスクリプトが必要です。

$ cat preprocess.awk 
BEGIN {                       # Before processing the file set OFS
    OFS="\t"                  # Set the Output Field Separator to a TAB
}
NR == 1 {                     # Process the header
    for (i=1;i<=NF;i++)       # Loop over every field in the header
        $i=$i OFS             # Add a second TAB to space headers correctly
    print $0                  # Print the header
    next                      # Get the next line in the file
}
NR % 2 {                      # For all the odd lines in the file (y lines)
    line = sep = ""           # Clear the line and separator variables
    for (i=1;i<=NF;i++) {     # Loop over the y value
        line = line sep x[i] OFS $i  # Concatenate x and y values
        sep = OFS             # Set after to avoid leading TAB
    }
    print line                # Print the line
    next                      # Get the next line in the file
}
{                             # If here then we are looking at the even lines (x)
    for (i=1;i<=NF;i++)       # Loop over the x values
        x[i] = $i             # Store values in array x
}

これにより、ヘッダーが 2 つのタブで区切られ、連続する行ですべてのxとのyペアが収集されます。

使用法:

次の入力を使用します。

$ cat file
h1 h2 h3 h4
x1 x2 x3 x4
y1 y2 y3 y4
x5 x6 x7 x8
y5 y6 y7 y8
x9 x10 x11 x12
y9 y10 y11 y12

プロデュース:

$ awk -f preprocess.awk file 
h1      h2      h3      h4  
x1  y1  x2  y2  x3  y3  x4  y4
x5  y5  x6  y6  x7  y7  x8  y8
x9  y9  x10 y10 x11 y11 x12 y12
于 2013-08-28T16:06:51.750 に答える
1

awk ワンライナーは次のとおりです。

$ awk 'NR==1{gsub("\t","\tspace\t");print;next}!(NR%2){split($0,a,"\t")}NR%2{for (i=1;i<=NF;i++) printf "%s\t%s\t", a[i], $i;print ""} ' file 
200.03  space   468.865 space   567.976 space   647.711
59.927  1576.77 58.099  2192.02 60.546  1630.22 61.461  1879.04 
59.769  1111.36 59.300  2674.2  60.380  1590.89 61.308  970.134 

または、より読みやすい形式で:

$ awk '
    NR==1{
        gsub("\t","\tspace\t")
        print
        next
    }
    !(NR%2){
        split($0,a,"\t")
    }
    NR%2{
        for (i=1;i<=NF;i++) 
            printf "%s\t%s\t", a[i], $i
            print ""
    } ' file 
于 2013-08-28T16:04:20.610 に答える