在bash中搜索文本中的日期并将它们放在变量数组中

时间:2018-03-20 09:15:40

标签: linux bash

我有一行txt文件:

2017-06-15 Take the car for inspection to change the wheels.mkd
2018-03-17 Crear un entorno virtual con Docker y xfce.mkd
2018-02-25 Envíar vídeo de explicación de configuración email de tunegocioenlanube a María.mkd
2018-03-08 crear curso tu formula emocional +tunegocio.mkd

我想在年,月,日中加入一系列bash:

year=( "2017","2018" )
month=( "03","06","02" )
day=( "08","15","17","25" )

谢谢大家。

4 个答案:

答案 0 :(得分:1)

您可以使用正则表达式解决此问题。请参阅awksed

但是,如果正则表达式对你来说太复杂了,你可以使用cut命令以更简单的形式解决问题。

cut是一个允许获取一行特定部分的命令(类似于在其他语言中分割)。

您只需使用-d选项设置分隔符,然后使用-f

选择字段

在您的情况下,您可以在文件的每一行中使用:

date=$(echo $line | cut -d " " -f 1)
year=$(echo $date | cut -d "-" -f 1)
month=$(echo $date | cut -d "-" -f 2)
day=$(echo $date | cut -d "-" -f 3)

有了这个,您可以获得所需的字段。然后,您可以将其保存在数组或任何您需要的地方

要将元素添加到现有数组,您可以阅读以下文章:https://unix.stackexchange.com/questions/328882/how-to-add-remove-an-element-to-from-the-array-in-bash

并且,要逐行读取文件,请执行以下操作: Read a file line by line assigning the value to a variable

答案 1 :(得分:1)

如果订单不重要,那么您可以使用以下内容:

mapfile -d '' day < <(printf '%s\0' "${!days[@]}" | sort -zn)

如果要对输出数组中的值进行排序,则可以将最终分配更改为例如:

days

这将打印day中的每个键后跟一个空字节,并按数字顺序对它们进行排序,将结果保存到数组static string Data(string tableName, string columnNames, string orderBy) { var type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(i => i.Name == tableName); using (var context = new BloggingEntities()) { var data = Select(type, columnNames, orderBy, context); var str = JsonConvert.SerializeObject(data); return str; } } static string Select(Type type, string columnNames, string orderBy, BloggingEntities _dbContext) { var data = _dbContext.Set(type).AsNoTracking().AsQueryable(); var selectStatement = "new ( " + columnNames + ")"; var filtered = data.Select(selectStatement).OrderBy(orderBy); return JsonConvert.SerializeObject(filtered); } 中。

答案 2 :(得分:1)

你可以这样做:

year=($(grep -Po '^\d+[^-]' InputFile.txt | uniq))
month=($(grep -Po '(?<=-)[0-9]+(?=-)' InputFile.txt | sort -u))
day=($(grep -Po '(?<=-)[0-9]+(?= )' InputFile.txt) | sort -u))

示例输出echo ${day[@]}

08 15 17 25

答案 3 :(得分:0)

while read Line
     do
         echo $Line
         var1=`echo "$Line" | awk 'BEGIN{FS=" "} {print $1}' | awk 'BEGIN{FS="-"} {print $1}'`
         var2=`echo "$Line" | awk 'BEGIN{FS=" "} {print $1}' | awk 'BEGIN{FS="-"} {print $2}'`
         var3=`echo "$Line" | awk 'BEGIN{FS=" "} {print $1}' | awk 'BEGIN{FS="-"} {print $3}'`
         year+=("$var1")
     month+=("$var2")
     day+=("$var3")
done < array.txt

上面的bash代码将从array.txt逐个读取行,提取值并将其存储在数组中。要打印数组中的所有值,可以使用以下命令:

printf '%s\n' "${year[@]}"
printf '%s\n' "${month[@]}"
printf '%s\n' "${day[@]}"