IDなど、各ファイルの各行に一意の列を共有する2つのCSVファイルがあります。このファイルにはタイトルがありません。 file_2 には、次の可変長列があります。
1,2,3
4,5,6,7,8
まず、 sort コマンドを使用してソートし、その列の結合を使用して、共通列に基づいて 2 つのフィールドを結合しました。これで、可変長列を含む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
これら3つの列を得ることができます。しかし、残りはどうすべきかわかりません。私はPythonでこれを行う方法を知っています。 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
純粋なシェルは、熱が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