我有一个包含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
有什么建议吗?提前谢谢,
答案 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
我希望这会对你有所帮助。