堆叠多列

堆叠多列

我想更改一个文件,以便对于每个 N = 奇数,将第 N+1 列放在第 N 列的末尾。例如,如果我有一个包含 4 列的文件,则第 2 列将粘贴在第 1 列的末尾,第 4 列将粘贴在第 3 列的末尾。

示例文件:

1 2 3 4
1 2 3 4
1 2 3 4

输出文件:

1 3
1 3
1 3
2 4
2 4
2 4

我的文件有 ~100 行和 ~60000 列。

答案1

使用bash:

#!/bin/bash

for c in 0 1; do
  while read -r -a columns; do
    for((i=$c; i<${#columns[@]}; i+=2)); do
      echo -n "${columns[$i]} "
    done
    echo
  done < file
done

输出:

1 3
1 3
1 3
2 4
2 4
2 4

答案2

这是一些相当神秘的 awk:

awk '{for (i=1; i<=NF; i+=2) {printf "%s ", $(i + (NR > FNR))}; print ""}' file file

第一次处理文件时,NR > FNR将为 false,即 0。
第二次处理文件时,NR > FNR将为 true,即 1。


这需要单次遍历文件,但您必须将一半文件保留在内存中:

awk '
    {
        for (i=1; i<NF; i+=2) {
            printf "%s ", $i
            row[NR] = row[NR] $(i+1) " "
        }
        print ""
    }
    END {
        for (i=1; i<=NR; i++) print row[i]
    }
' file

相关内容