有没有更好的方法将两列或更多列打印成一列,例如
input.file
AAA 111
BBB 222
CCC 333
输出:
AAA
BBB
CCC
111
222
333
我只能想到:
cut -f1 input.file >output.file;cut -f2 input.file >>output.file
但是如果有很多列,或者当我想将输出导入到其他命令(如sort
)时,这并不好。
还有其他建议吗?非常感谢!
有没有更好的方法将两列或更多列打印成一列,例如
input.file
AAA 111
BBB 222
CCC 333
输出:
AAA
BBB
CCC
111
222
333
cut -f1 input.file >output.file;cut -f2 input.file >>output.file
但是如果有很多列,或者当我想将输出导入到其他命令(如sort
)时,这并不好。
还有其他建议吗?非常感谢!
awk
awk '{if(maxc<NF)maxc=NF;
for(i=1;i<=NF;i++){(a[i]!=""?a[i]=a[i]RS$i:a[i]=$i)}
}
END{
for(i=1;i<=maxc;i++)print a[i]
}' input.file
gawk '{for (i=1; i<=NF; i++) # loop over columns
data[i][NR]=$i # store in data[column][line]
}
END {for (i=1;i<=NR;i++) # loop over lines
for (j=1;j<=NF;j++) # loop over columns
print data[i][j] # print the given field
}' file
NR
代表记录数(即此处的行数),NF
代表字段数(即给定行中的字段数)。
如果列数在行之间发生变化,那么我们应该使用另一个数组,用于存储每行的列数。但是在问题中我没有看到对此的要求,所以现在我暂时不进行处理。
以下是具有三列的示例:
$ cat a
AAA 111 123
BBB 222 234
CCC 333 345
$ gawk '{for (i=1; i<=NF; i++) data[i][NR]=$i} END {for (i=1;i<=NR;i++) for (j=1;j<=NF;j++) print data[i][j]}' a
AAA
BBB
CCC
111
222
333
123
234
345
$ cat sc.wk
{for (i=1; i<=NF; i++)
data[i][NR]=$i
columns[NR]=NF
}
END {for (i=1;i<=NR;i++)
for (j=1;j<=NF;j++)
print (i<=columns[j] ? data[i][j] : "-")
}
$ cat a
AAA 111 123
BBB 222
CCC 333 345
$ awk -f sc.wk a
AAA
BBB
CCC
111
222
333
123
-
345
data[i,j]
与 data[i][j]
一样容易使用。 - kdhpawk '{print $1;list[i++]=$2}END{for(j=0;j<i;j++){print list[j];}}' input.file
输出
AAA
BBB
CCC
111
222
333
awk -v RS="[[:blank:]\t\n]+" '1' input.file
$ cat <(cut -f 1 asd) <(cut -f 2 asd)
AAA
BBB
CCC
111
222
333
由于顺序无关紧要:
$ awk 'BEGIN {RS="[ \t\n]+"} 1' file
AAA
111
BBB
222
CCC
333
这将适用于任意数量的以空格分隔的列
awk '{for (A=1;A<=NF;A++) printf("%s\n",$A);}' input.file | sort -u > output.file
awk -F: '{for (A=1;A<=NF;A++) printf("%s\n",$A);}' input.file | sort -u > output.file
丑陋,但它能用-
for i in {1..2} ; do awk -v p="$i" '{print $p}' input.file ; done
将{1..2}
更改为{1..n}
,其中'n'
是输入文件中列数的数量
解释-
我们定义一个变量p,它本身就是变量i。 i的值从1到n变化,在每个步骤中,我们打印文件的第'i'列。
awk
本身,就像两个正分数答案! - Inian
我不关心顺序,我只是想在排序和去重之后进行操作
,那么你可能会得到一个更简单的解决方案。 - Sundeepsed 's/\s\+/\n/g' input.file
- Sundeep