首页 > 解决方案 > 以递增和递减顺序分布数据

问题描述

我有一个有 n 行的文件,我希望它的数据按照以下顺序分布在 7 个文件中

** 我的输入文件有 n 行,这只是一个例子。

输入文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
5
16
17
.
.
28

输出文件

 1  2  3  4  5 6  7
14 13 12 11 10 9  8 
15 16 17 18 19 20 21
28 27 26 25 24 23 22

所以如果我打开第一个文件它应该有行

1
14
15
28

同样,如果我打开第二个文件,它应该有行

2
13
16
27

其他文件也同样输出。

任何人都可以请帮助,使用下面的代码它正在做需要但不是按要求的顺序。

awk '{print > ("te1234"++c".txt");c=(NR%n)?c:0}' n=7 test6.txt
1  2  3  4  5  6  7
8  9  10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28

标签: shellawksed

解决方案


编辑:由于 OP 改变了 Input_file 的样本完全不同,所以现在添加这个解决方案,再次只用显示的样本编写和测试。

xargs+单awk:(推荐一个)

xargs -n7 < Input_file | 
awk '
FNR%2!=0{
  for(i=1;i<=NF;i++){
    print $i >> (i".txt")
    close(i".txt")
  }
  next
}
FNR%2==0{
   for(i=NF;i>0;i--){
     count++
     print $i >> (count".txt")
     close(i".txt")
   }
   count=""
}'

初步解决方案:

xargs -n7 < Input_file | 
awk '
FNR%2==0{
  for(i=NF;i>0;i--){
    val=(val?val OFS:"")$i
  }
  $i=val
  val=""
}
1' | 
awk '
{
  for(i=1;i<=NF;i++){
    print $i >> (i".txt")
    close(i".txt")
  }
}'

上面也可以用single完成,awk也会在几分钟内添加xargs+ (single)解决方案。awk



您能否尝试在 GNU 中使用显示的示例进行跟踪、编写和测试awk

awk '{for(i=1;i<=NF;i++){print $i >> (i".txt");close(i".txt")}}' Input_file

推荐阅读