0

我输入的数据看起来像这样,格式为“mm/yyyy,数据”:

Location 1
08/2012, 44.1
09/2012, 34.2
10/2012, 24.3
11/2012, 14.4
12/2012, 04.5
01/2013, 14.6
02/2013, 24.7
Location 2
08/2012, 33.1
09/2012, 44.2
10/2012, 55.3
11/2012, 66.4
12/2012, 77.5
01/2013, 88.6
02/2013, 11.7
Location 3
08/2012, 35.1
09/2012, 45.2
10/2012, 55.3
11/2012, 66.4
12/2012, 77.5
01/2013, 71.6 
02/2013, 19.7
Location 4
etc
etc

我正在使用一个 awk 脚本,就是这样 -

awk '}printf (NR %276 == 0 )? $0"\n" : $0"\t" }' 输入文件(我使用的是 NR%276,因为这是每个新重复列的列长度或上面部分显示的原始数据中的“位置”)。awk 可以在 n 列输出中将单列数据块从“位置 X”划分到“位置 Y”吗?

我正在获取输出,但以文本换行方式水平运行单个 col 输入文件的输出或像这样“蛇行”是不正确的 - 位置 1 mm/yyyy、data1 data2 等位置 2 mm/yyyy、data1 data2 等位置3 mm/yyyy, data1 data2 etc.

相反,我需要我的输出数据类似于此,但对于 276 行和大约 150 列/位置或输入文件中 276 行的“位置”数据的最后一个单列块(如上所示的缩短示例)。将有助于将行数增加到 277,例如 03/2013 或 >150 个位置。

Location 1        Location 2        Location 3
08/2012, 44.1     08/2012, 33.1     08/2012, 35.1
09/2012, 34.2     09/2012, 44.2     09/2012, 45.2
10/2012, 24.3     10/2012, 55.3     10/2012, 55.3
11/2012, 14.4     11/2012, 66.4     11/2012, 66.4
12/2012, 04.5     12/2012, 77.5     12/2012, 77.5
01/2013, 14.6     01/2013, 88.6     01/2013, 71.6
02/2013, 24.7     02/2013, 11.7     02/2013, 19.7

谢谢!!

4

3 回答 3

1

试试这个单行:

 awk '/^Location/{j=0;++i}{l[i,++j]=$0}END{for(m=1;m<=j;m++){for(n=1;n<=i;n++)printf l[n,m] (n==i?"":"\t");print ""}}' file

笔记

  • 上面的行将你的一列输入转换为三列输出,没有处理你的276 rows东西。(我认为我们不需要做那个计算。)
  • 在输出中,列是tab分开的。
  • 行和列不是硬编码的,您可以使用真实数据进行测试

用你的数据测试:

kent$  awk '/^Location/{j=0;++i}{l[i,++j]=$0}END{for(m=1;m<=j;m++){for(n=1;n<=i;n++)printf l[n,m] (n==i?"":"\t");print ""}}' file      
Location 1      Location 2      Location 3
08/2012, 44.1   08/2012, 33.1   08/2012, 35.1
09/2012, 34.2   09/2012, 44.2   09/2012, 45.2
10/2012, 24.3   10/2012, 55.3   10/2012, 55.3
11/2012, 14.4   11/2012, 66.4   11/2012, 66.4
12/2012, 04.5   12/2012, 77.5   12/2012, 77.5
01/2013, 14.6   01/2013, 88.6   01/2013, 71.6 
02/2013, 24.7   02/2013, 11.7   02/2013, 19.7

编辑评论

 awk '!/^[0-9]/{j=0;++i}{l[i,++j]=$0}END{for(m=1;m<=277&&m<=j;m++){for(n=1;n<=i;n++)printf l[n,m] (n==i?"":"\t");print ""}}' file 
  • 上面的行与硬编码的“位置”不匹配,但适用于非数字标题(也适用于“位置”)
  • 276, 277 我不知道是什么意思。但是上面的一行将为每个块(在您的示例中的位置)打印最多 276 行。如果行数小于 276,则只打印实际行数。

您可以稍微调整一下单线,以满足您的需求。

祝你好运。

于 2013-03-18T17:41:40.697 回答
1

假设每个位置的数据行数相同:

numcols=$(tac input_file | awk '$1 == "Location" {print $2; exit}')
pr -t -s --columns=$numcols input_file

由于您知道每个位置有多少行,因此计算位置数:

numcols=$(( $(wc -l < input_file) / 277 ))
于 2013-03-18T18:47:37.240 回答
0

您可以尝试另一个 awk:

awk '!/^[0-9]/{n=0} {n++; A[n]=A[n] (A[n]?OFS:x) $0} END{for(i=1; i<=n; i++) print A[i]}' OFS='\t' file

要在每个位置仅打印第二列:

awk '!/^[0-9]/{n=0} {n++; A[n]=A[n] (A[n]?OFS:x) $2} END{for(i=1; i<=n; i++) print A[i]}' OFS='\t' file
于 2013-03-18T22:10:01.693 回答