我想更改一个文件,以便对于每个 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