将每X行输入放入新列

时间:2016-07-05 11:58:35

标签: linux bash shell awk

我有一个包含3972192行的文件,每行分隔两个值制表符。我想将每个47288行分成一个新列(这个列派生成84列)。我读了这些其他问题(Put every N rows of input into a new column),其中它和我想要的一样,但是我得到了awk:

awk: program limit exceeded: maximum number of fields size=32767

如果我用pr做,那么要分离的列的限制是36。

为此,我首先使用awk选择了第2列:

awk '{print $2}' input_file>values_file

为了获得我做的第一列值:

awk '{print $1}' input_file>headers_file

head -n 47288 headers_file >headers_file2

一旦我得到这两个文件,我会将它们与粘贴功能放在一起:

paste -d values_file headers_file2 >Desired_output

实施例: INPUT:

 -Line1:        ABCD     12

 -Line2:         ASDF     3435

...


-Line47288:     QWER     345466

-Line47289:     ABCD     456

...


-Line94576:     QWER     25

...

-Line3972192    QWER     436

希望输出通缉:

- Line1:         ABCD     12         456 ....

...

- Line47288:     QWER     345466     25  ....     436

有什么建议吗?提前谢谢,

1 个答案:

答案 0 :(得分:1)

我认为每个块具有相同的模式,我的意思是,第一列的顺序相同[ABCD ASDF ... QWER]。 如果是这样,您必须获取第一个BLOCK [47288行]的第一列并回显到目标文件。 然后,您必须获取每个BLOCK的第二列并将其粘贴到目标文件。 我试过这个数据文件:

ABCD    1001
EFGH    1002
IJKL    1003
MNOP    1004
QRST    1005
UVWX    1006
ABCD    2001
EFGH    2002
IJKL    2003
MNOP    2004
QRST    2005
UVWX    2006
ABCD    3001
EFGH    3002
IJKL    3003
MNOP    3004
QRST    3005
UVWX    3006
ABCD    4001
EFGH    4002
IJKL    4003
MNOP    4004
QRST    4005
UVWX    4006
ABCD    5001
EFGH    5002
IJKL    5003
MNOP    5004
QRST    5005
UVWX    5006

用这个脚本:


    #!/bin/bash

    #target number of lines, change to 47288
    LINES=6
    INPUT='data.txt'
    TOTALLINES=`wc --lines $INPUT | cut --delimiter=" " --field=1`
    TOTALBLOCKS=$((TOTALLINES / LINES))


    #getting first block of target file, the first column of first LINES of data file
    head -n $LINES $INPUT | cut --field=1 > target.txt

    #get second column of each line, by blocks, and paste it into target file
    BLOCK=1
    while [ $BLOCK -le $TOTALBLOCKS ]
    do
        HEADVALUE=$((BLOCK * LINES))
        head -n $HEADVALUE $INPUT | tail -n $LINES | cut --field=2 > tmpcol.txt
        cp target.txt targettmp.txt
        paste targettmp.txt tmpcol.txt > target.txt
        BLOCK=$((BLOCK+1))
    done

    #removing temp files
    rm -f targettmp.txt
    rm -f tmpcol.txt

我得到了这个目标文件:

ABCD    1001    2001    3001    4001    5001
EFGH    1002    2002    3002    4002    5002
IJKL    1003    2003    3003    4003    5003
MNOP    1004    2004    3004    4004    5004
QRST    1005    2005    3005    4005    5005
UVWX    1006    2006    3006    4006    5006

我希望这会对你有所帮助。