我有两个 CSV 文件,它们共享每个文件中每一行唯一的列,例如 ID。这些文件没有标题。 file_2 具有可变长度列,例如
1,2,3
4,5,6,7,8
我首先通过使用 sort 命令进行排序并在该列上使用 join 来连接到两个基于公共列的字段。现在我有一个带有可变长度列的 csv 文件。
我想按以下顺序选择列:
second column, first column, third column, {from 4th column onwards every 3rd column till end of row. e.g., 4,7,10...}
我试过awk -F "\"*,\"*",\"*" '{print $2 $1 $3}' joinedfile.csv
并能够获得这三列。但不知道如何处理其余的事情。我知道如何在 python 中做到这一点。我想知道如何在 shell 命令(如 cut 或 awk)中执行此操作。我猜 awk 中的 while 循环可能会有所帮助,但不确定如何构建。
答案1
就像是:
awk -F, '{
# print first three columns
printf("%s,%s,%s", $2,$1,$3);
#for all other columns
for ( i = 4; i < NF; i++ )
{
# if column number every third
if ( ( i - 4 ) % 3 == 0) {
printf(",%s", $i);
}
}
#print newline
print "";
}' your_file.csv
答案2
纯 shell,只要少于 26 列就应该可以工作:
while IFS=, read a b c d e f g h i j k l m n o p q r s t u v w x y z
do
printf '%s,' $b $a $c $d $g $j $m $p $s $v $y
printf '\b \b\n'
done < joinedfile.csv
如果有更多的超过 26 列,试试这个:
tr , ' ' < joinedfile.csv |
while read a; do
set -- $a
printf '%s,' $2 $1 $3
while [ "$4" ] ; do
shift 3
printf '%s,' "$1"
done
printf '\b \b\n'
done