Bash:以数字方式对文件进行排序,但仅限于第一个字段与模式匹配的位置

时间:2017-04-11 14:04:33

标签: bash sorting

由于过去的命名行为很糟糕,我留下了一份名单,这些名单被证明是一项挑战。最重要的是,我希望将最新的名称(按日期)放在变量中。所有名称都在名为bar.txt的文件中列出(未排序)。

在这种情况下,我无法重命名,也无法获得图像的实际日期;这些名字都是我必须继续下去的。名称可以遵循几种模式中的一种;

foo
YYYYMMDD-foo
YYYYMMDD##-foo

foo可以是从单个字符到长字母/数字/符号的任何内容。我只对匹配第二个用例YYMMDD-foo的名称感兴趣,因为这些名称来自我们开始标记后的一致性。

我想最终得到一个包含模式YYMMDD-foo之后的最新日期的变量。

我知道sort -k1 -n < bar.txt,但后来我不确定如何隔离第二个模式的结果以提取我需要的内容。

如何对文件进行排序以忽略除第二种模式之外的任何内容,并返回最新日期?

样品

鉴于bar.txt看起来像这样;

test
2017120901-develop-BUILD-31
20170326-TEST-1.2.0
20170406-BUILD-40-1.2.0-test
2010818_001

我想提取20170406-BUILD-40-1.2.0-test

1 个答案:

答案 0 :(得分:2)

由于您的要求涉及1)仅获取特定格式的文件2)应用排序并仅获取最新文件。我使用<?php $dbHost = 'DBHOST'; $dbUser = 'DBUSER'; $dbPassword = 'DBPASSWORD'; $dbName = 'DBNAME'; $tables = '*'; backup_tables($dbHost,$dbUser,$dbPassword,$tables); /* backup the db OR just a table */ function backup_tables($host,$user,$pass,$name,$tables = '*') { $db = new PDO("mysql:host=$host;dbname=$name;", $user, $pass); //get all of the tables if($tables == '*') { $tables = array(); $result = $db->query('SHOW TABLES'); $tables= $result->fetchAll(PDO::FETCH_COLUMN, 0); } else { $tables = is_array($tables) ? $tables : explode(',',$tables); } $return=""; //cycle through foreach($tables as $table) { $return.= 'DROP TABLE IF EXISTS '.$table.';'; $result=$db->query('SHOW CREATE TABLE '.$table); $row2 = $result->fetch(PDO::FETCH_NUM); $return.= "\n\n".$row2[1].";\n\n"; $result = $db->query('SELECT * FROM '.$table); foreach ($result->fetchAll(PDO::FETCH_ASSOC) as $key=>$value) { // build query... $return .= "INSERT INTO $table (`".implode("`, `", array_keys($value))."`) VALUES ('".implode("', '", $value)."');\n\n"; } $return.="\n\n\n"; } //save file $handle = fopen('db-backup-'.date('Y-m-d--H-i-s').'-'.(md5(implode(',',$tables))).'.sql','w+'); fwrite($handle,$return); fclose($handle); } &amp; Awk共同实现它

GNU sort

该解决方案的工作原理是仅在第一列具有与awk -F'-' 'length($1) == 8' file | sort -nrk1 | head -1 20170406-BUILD-40-1.2.0-test 对齐完全对应的8个字符的文件中获取。过滤后,YYYYMMDD应用于第一个字段,第一行使用sort获得。