2列目の値が特定の値よりも小さい行を分離したいと思います。
入力例:
id1 19501112
id2 19831207
id3 20001212
id6 20000101
id10 20061213
id11 20081212
id12 20100109
id13 20101218
id14 20101212
id15 20111111
id16 20150919
id20 20141415
2番目のフィールドの値が20100101未満の行を抽出したいので、出力は次のようになります。
id1 19501112
id2 19831207
id3 20001212
id6 20000101
id10 20061213
id11 20081212
何か提案をお願いしますか?
$ awk '$2<20100101' file
id1 19501112
id2 19831207
1d3 20001212
id6 20000101
id10 20061213
id11 20081212
典型的なawkプログラムは、次のようなコマンドで構成されています。
condition { action }
この場合、条件は2番目の列が20100101未満であることです。この条件は、合理的には$2<20100101
と記述されます。 actionを提供しないため、awkは行を出力するデフォルトのアクションを実行します。
Perlのアプローチ:
Perl -ane 'print if $F[1]<20100101' file
-n
は、入力ファイルを1行ずつ読み取り、-e
で指定されたスクリプトを適用します。 -a
はPerl
をawk
のように動作させ、空白の各入力行を自動的に分割し、各フィールドを配列@F
の要素として保存します。したがって、2番目のフィールド(F[1]
、配列は0から始まる)が20100101未満の場合、スクリプト自体が1行を出力します。
シェルバージョン:
(while read l; do [ `echo $l | cut -d ' ' -f 2` -lt 20100101 ] && echo $l; done) < file
ケース2の場合、これはBashで実行できます。たとえば、以下のファイルをsplitとして保存します。
#!/usr/bin/env bash
# Usage: ./split 'data.txt' 'value'
paired=( )
value="$2"
while read -a paired
do
[[ ${paired[1]} < $value ]] &&
echo "${paired[@]}" >> lessthan.txt ||
echo "${paired[@]}" >> morethan.txt
done < "$1"
# end file
変数pairedは配列であることに注意してください。 read -a pairedを使用すると、各行がゼロベースのペアの配列に読み込まれるため、要素1が各行の対象の数になります。 splitの引数2は、分割に使用される値です。
ケース1の場合、何をしたいのかわかりませんが、ファイルの各行を読み取るときに、列1${paired[0]}
または列2${paired[1]}
を任意のファイルに送信できるように、上記を変更できます。列2の値によって異なります。
Javaバージョン(Javaコンパイラが必要です。個人的にはopenJDKを使用しています)
次の内容で*.Java
ファイルを作成します。
import Java.io.File;
import Java.util.Scanner;
import Java.io.IOException;
public class secondColumn
{
public static void main (String[] args) throws IOException
{
File inpFile = new File (args[0]);
Scanner scan = new Scanner(inpFile);
String id = "";
int num = 0;
while (scan.hasNext())
{
id = scan.next();
num = scan.nextInt();
if ( num < 20100101 )
System.out.println(id + " " + num);
}
}
}
次のようにコンパイルして実行します。
xieerqi:$ javac secondColumn.Java
xieerqi:$ Java secondColumn inputFile.txt
id1 19501112
id2 19831207
1d3 20001212
id6 20000101
id10 20061213
id11 20081212