特定の日付より最新のファイルの行を削除する

特定の日付より最新のファイルの行を削除する

特定の日付よりも最新の行を削除する方法がわかりません。ファイルの内容の一部です。

save.txt ビルド

647919 2013/11/30
647946 2013/11/30
647955 2013/12/01
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04

2013/12/03以降の行を削除し、2013年12月3日以降の行のみを残したいと思います。

647919 2013/11/30
647946 2013/11/30
647955 2013/12/01

Bashでこれを行うにはどうすればよいですか?

答え1

この日付は辞書式と年代順に同じように並べ替えられるため、語彙比較を実行してください。

awk '$2 < "2013/12/03"'

答え2

システムにこのコマンドのGNUバージョンが含まれている場合は、dateそれを使用して日付フィールド(存在する場合はtailを削除した後<br>)をSeconds-Since-epochに変換し、同じ形式(bashなど)の期限と直接比較できます。

testsecs=$(date +%s --date="2013/12/03")
while IFS= read -r line; do
  read -r x d <<< "$line" 
  if (( $(date +%s --date="${d%<br>}") < $testsecs )); then
    printf '%s\n' "$line"
  fi
done < buildsave.txt

[これは内部削除を実行しないことに注意してください。結果を一時ファイルに保存して名前を変更する必要があります。 ]

答え3

<br>コラム最後の質問におっしゃった内容は必要ないと思いますdate。とにかく存在する場合は簡単に削除できます。ただし、主要部分に移動したら、次のようにして目的のタスクを達成できます。

sort -k 2n filename.txt

これで、上記のコマンドはソートされた方法で出力を提供します。これで、次のコマンドを実行すると、必要なものが得られます。

sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}' 

説明する

sortコマンドは、デフォルトで日付の2番目の列に基づいてファイルをソートします。入力ファイルはデフォルトですべてのデータをソートするので、コマンドが機能するかどうかをテストするために入力ファイルを変更しました。その後、awkコマンドは特定の一致が見つかるまですべての行を印刷します。

テスト

cat filename.txt

647919 2014/01/01
647946 2012/11/30
647955 2011/01/04
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04

これでsort -k 2n filename.txt出力は次のようになります。

647955 2011/01/04
647946 2012/11/30
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04
647919 2014/01/01

これで、ファイルが2番目の列にソートされていることに満足しています。ここで値を選択してください。に従って特定の日付、

sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}' 

上記の例では、すべての値を取得しました2013/12/03。出力は、

647955 2011/01/04
647946 2012/11/30

いいえ、これは<br>私のファイルの一部です。

この場合、以下のようにコマンドを少し調整できます。

awk '{print $1, substr($2, 1, length($2)-4)}' filename.txt | 
sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}' 

そのため、2番目の列からすべてのラベルを削除し、上記のコマンド<br>をパイプで接続しました。

引用する

https://unix.stackexchange.com/a/11323/47538

https://unix.stackexchange.com/a/83069/47538

答え4

あなたが提供した日付に対する迅速で汚い解決策は、sedを使用してそれ以降の日付と一致するすべての行を削除することです。

sed -i "" "#[0-9]* 2013/12/0[4-9]#d" testfile.txt
sed -i "" "#[0-9]* 2013/12/[123][0-9]#d" testfile.txt
sed -i "" "#[0-9]* 2014/[0-9][0-9]/[0-3][0-9]#d" testfile.txt

-i ""はバックアップを作成せずにファイルの内部を直接置き換えますが、-i ""を使用せずに3つのsedコマンドをすべてテストファイルにパイプすることもできます。

システム(LinuxまたはMac)によっては、-iの後に「」を省略することがあり、時には正規表現の-eパラメータが必要になることがあります。自分に合うようにしてみてください。

sedに関する追加情報を含む関連質問:https://stackoverflow.com/questions/5410757/

関連情報