20K行の長いコンマ区切りの区切りファイルがあります。サンプルは次のとおりです。
"","id","number1","number2","number3","number4","number5","number6","number7"
"1","MRTAT_1of3.RTS",17.1464602742708,17.1796255746079,17.1132949739337,0.996138996138996,-0.0055810322632996,1,1
"2","MRTAT_2of3.RTS",3.88270908946253,6.13558056235995,1.62983761656512,0.265637065637066,-1.91247162787182,0.718084341158075,1
"3","MRTAT_3of3.RTS",3.87323328936623,1.22711611247199,6.51935046626046,5.31274131274131,2.40945646701554,0.676814519398334,1
Id、number4、number5、number 6の列のように、タブ区切り設定で条件number4が4.0より大きいように印刷したいと思います。次に出力例をいくつか示します。
id number4 number5 number6
MRTAT_3of3.RTS 5.31274131274131 2.40945646701554 0.676814519398334
awk -F , -v OFS='\t' 'NR == 1 || $6 > 4 {print $1, $6, $7, $8}' input.txt
私はawkが最良の解決策であることに同意します。あなたcan他のいくつかのツールを使ってbashでこれを行う:
cut -d , -f 2,6,7,8 filename | {
read header
tr , $'\t' <<< "$header"
while IFS=, read -r id num4 num5 num6; do
# bash can only do integer arithmetic
if [[ $(bc <<< "$num4 >= 4.0") = 1 ]]; then
printf "%s\t%s\t%s\t%s\n" "$id" "$num4" "$num5" "$num6"
fi
done
}
上記のawkスクリプトに勝るものはありませんが、ここにRubyソリューション、
#!/usr/bin/Ruby1.9.1
puts "id\tnumber4\tnumber5\tnumber6"
ARGF.each_line do |line|
arr = line.split(',')
puts "#{arr[1]}\t#{arr[5]}\t#{arr[6]}\t#{arr[7]}" if arr[5].to_f > 4.0
end
スクリプトを使用するには、ファイル名を指定してスクリプトを呼び出すか、ファイルをパイプします。
Perlソリューション:
Perl -F, -le '$, = "\t"; print @F[1,5,6,7] if $F[5] > 4 || $. == 1' file
-F,
は、分割するパターンを指定します。-F
は暗黙的に-a
を設定します
-a
を-n
と併用すると、自動分割モードがオンになります。@F
配列への暗黙の分割コマンドは、-n
によって生成される暗黙のwhileループ内で最初に実行されます。-a
は暗黙的に-n
を設定します
-n
を指定すると、Perlはプログラムのループを想定します。これにより、sed -n
やawk
のようなファイル名引数が反復されます。
-l
は、自動行末処理を有効にします。 2つの異なる効果があります。最初に、入力レコード区切り記号(\n
)が自動的に表示されます。次に、出力レコードセパレータを\n
に割り当てます。
-e
1行のプログラムを入力するために使用
したがって、Perl -F, -le '$, = "\t"; print @F[1,5,6,7] if $F[5] > 4 || $. == 1'
は次のようなことを行います。
use English;
$OUTPUT_RECORD_SEPARATOR = $INPUT_RECORD_SEPARATOR;
while (<>) { # iterate over each line of the each file
chomp;
@F = split(',');
$OUTPUT_FIELD_SEPARATOR = "\t";
print @F[1,5,6,7] if $F[5] > 4 || $INPUT_LINE_NUMBER == 1;
}