我有两个文件在列中具有相同的字符串,但顺序不同。
文件test1:
testbench.clk1 667
testbench.clk1_temp_net 667
testbench.clk 2000
和文件test2:
testbench.clk1 533
testbench.clk 1611
testbench.clk1_temp_net 538
我在第1列上对两个文件运行sort命令,它给出了不同的输出:
sort -t " " -k1 test1
testbench.clk1 667
testbench.clk1_temp_net 667
testbench.clk 2000
sort -t " " -k1 test2
testbench.clk1 533
testbench.clk 1611
testbench.clk1_temp_net 538
你能解释为什么我得到这个输出,这是什么是正确的解决方案?
答案 0 :(得分:4)
来自sort --debug -k1 file1
sort: es werden die Sortierregeln für »de_DE.utf8“ verwendet
sort: führende Leerzeichen sind signifikant in Schlüssel 1: Sie sollten daher wahrscheinlich auch „b“ angeben
:
许多选项会影响'sort'对比行的方式;如果结果是 出乎意料的是,试试'--debug'选项来看看发生了什么。
让我们这样做(在我的de_DE.utf8系统上)
sort: sorting rules for »de_DE.utf8“ in use
sort: preceding whitspace is significant in key 1: You might want to use „b“
不幸的是,用英语运行命令来显示会发生什么是没有意义的。翻译它:
LANG=C sort -k1b file1
当我使用以下命令运行命令时
LANG=C sort -b file1
可以只是
LANG=C sort -k1,1b -k2,2n file
订单看起来不错。我想这对你来说也是一个语言环境问题。
顺便说一句,如果你想要一个分层排序字段1,则field2然后使用:
csh
问题被标记为bash但事实证明OP正在使用$LANG
。在这种情况下,您需要像这样传递env LANG=C sort ...
:
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class Login extends AppCompatActivity implements View.OnClickListener {
Button _login_button;
EditText _AbovePNDUsername, _AbovePNDPassword;
SQLiteDatabase db;
SQLiteOpenHelper openHelper;
Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
openHelper = new RegisterUserinDatabase(this);
db = openHelper.getReadableDatabase();
_login_button = (Button) findViewById(R.id.login_button);
_AbovePNDUsername = (EditText) findViewById(R.id.AbovePNDUsername);
_AbovePNDPassword = (EditText) findViewById(R.id.AbovePNDPassword);
_login_button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.login_button) {
String username = _AbovePNDUsername.getText().toString();
String password = _AbovePNDPassword.getText().toString();
cursor = db.rawQuery("SELECT * FROM " + RegisterUserinDatabase.TABLE_NAME + "WHERE"
+ RegisterUserinDatabase.COLUMN_USERNAME + "=? AND" + RegisterUserinDatabase.COLUMN_PASSWORD
+ "=?", new String [] {username, password});
if(cursor != null)
{
if(cursor.getCount()> 0){
cursor.moveToNext();
Toast.makeText(getApplicationContext(), "login successfully", Toast.LENGTH_LONG).show();
startActivity(new Intent(this, add_treatment.class));
}
else {
Toast.makeText(getApplicationContext(), "error in login", Toast.LENGTH_LONG).show();
}
}
}
}
答案 1 :(得分:0)
要正确排序,您需要指定用于按列表中的第一列和第二列对数据进行排序的键。
sort -k1,1 -k2,2 test1
testbench.clk 2000
testbench.clk1 667
testbench.clk1_temp_net 667
和file2
sort -k1,1 -k2,2 test2
testbench.clk 1611
testbench.clk1 533
testbench.clk1_temp_net 538
如果你只使用-k1,那么它将使用第一个键到行尾 - 这与默认排序相同。问题是,显然排序将数字之间的空格视为千位分隔符,就像在某些语言中一样。即使未使用数字排序,这也会导致testbench.clk 1611
变为testbench.clk1611
而testbench.clk1 533
变为testbench.clk1533
。
没有必要混淆LANG或LC_COLLATE变量。这样做可能会导致您的排序对某些语言产生错误的结果。例如。捷克语中使用的字符č
以及许多其他字符将被错误地排序。