sort命令给出意外输出

时间:2017-08-17 18:17:42

标签: linux sorting terminal csh

我有两个文件在列中具有相同的字符串,但顺序不同。

文件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

你能解释为什么我得到这个输出,这是什么是正确的解决方案?

2 个答案:

答案 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

问题被标记为但事实证明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.clk1611testbench.clk1 533变为testbench.clk1533

没有必要混淆LANG或LC_COLLATE变量。这样做可能会导致您的排序对某些语言产生错误的结果。例如。捷克语中使用的字符č以及许多其他字符将被错误地排序。