複数の熱を積む

複数の熱を積む

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

バッシュ使用:

#!/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
24
24
24

答え2

これはかなり秘密のawkです。

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

ファイルが最初に処理されると、NR > FNRfalse(0)になります。
ファイルが2番目に処理されると、NR > FNRtrue、つまり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

関連情報