date
当提供的变量没有/空值时,命令如何输出空/无。我知道if else
语句可以做到这一点,但我觉得这不是正确的方法。是否有合适的命令或更改date
命令来执行此操作?
例如
myDay=""
bDay=`date -d "$myDay"`
echo "$bDay" // this should have no output
date
当提供的变量没有/空值时,命令如何输出空/无。我知道if else
语句可以做到这一点,但我觉得这不是正确的方法。是否有合适的命令或更改date
命令来执行此操作?
例如
myDay=""
bDay=`date -d "$myDay"`
echo "$bDay" // this should have no output
我想file.txt
按日期对内容进行排序。要排序的日期在第四个表格数据<td></td>
标签中
例如内容file.txt
:
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2018Mar01</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2017Jan31</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2018Apr02</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2017Dec25</td></tr>
期望的输出:我该怎么做?
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2017Jan31</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2017Dec25</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2018Mar01</td></tr>
<tr><td>some_name_here</td><td>number_code_here</td><td>2018Mar31</td><td>2018Apr02</td></tr>
我一直在使用sort
命令,但它不起作用。
cat file.txt 2> /dev/null | sort -t'>' -k9n -k9.4M -k9.7n
编辑:我找到了这个参考链接,但仍然无法正常工作。 https://stackoverflow.com/a/16060031/7842707
我想将文件名/s 与匹配模式一起打印,但即使模式匹配在文件中多次出现,也只能打印一次。
例如,我有一个模式列表;list_of_patterns.txt
我需要找到文件的目录是/path/to/files/*
.
list_of_patterns.txt:
A
B
C
D
E
/路径/到/文件/
/file1
/file2
/file3
假设有多次这样/file1
的模式:A
/文件1:
A
4234234
A
435435435
353535
A
(同样适用于有多个模式匹配的其他文件。)
我有这个 grep 命令正在运行,但是每次模式匹配时它都会打印文件名。
grep -Hof list_of_patterns.txt /path/to/files/*
输出:
/file1:A
/file1:A
/file1:A
/file2:B
/file2:B
/file3:C
/file3:B
... and so on.
我知道 sort 可以在 grep 命令之后通过管道执行此操作,grep -Hof list_of_patterns.txt /path/to/files/* | sort -u
但它仅在 grep 完成时执行。在现实世界中,我list_of_patterns.txt
的内部有数百种模式。有时需要一个小时才能完成任务。
有没有更好的方法来加速这个过程?
更新:一些文件有超过一百次匹配模式。例如/file4
,模式出现A
900 次。这就是为什么需要grep
一个小时才能完成的原因,因为它会打印每次出现的模式匹配以及文件名。
例如输出:
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
... and so on til' it reach 900 occurrences.
我只希望它只打印一次。
例如期望的输出:
/file4:A
/file1:A
/file2:B
/file3:A
/file4:B
我想以相反的顺序获取从模式A匹配行到第一次出现的模式B匹配行以及它通过的行的行。
更新:example_file.txt
ISA*00* *00* *ZZ*SIX-SIX6 *12*666666666666 *66666666*6666*U*666666666*6666666666*0*P*\
GS*FA*SIX-SIX-SIX*666666666*6666666*6666*6666*X*66666
ST*666*666
AK1*SX*666
AK2*777*6666666
AK5*A
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
AK2*777*6666666
AK5*A
AK2*777*69696969
AK3*J7*5**3
AK4*3*6969*4
AK5*R*5
AK9*P*20*20*19
SE*69*6969
GE*1*6767
IEA*1*0000000000
我想要的是,从下到上,得到它后面的所有AK5
模式R
,如下所示:
模式一:AK5*R
并让所有的线上升,直到模式B的第一次出现被匹配。例如:
模式乙:AK2
期望的输出:
第一个匹配的模式A将被称为E1
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
更新:匹配的第二个模式A将称为E2
AK2*777*69696969
AK3*J7*5**3
AK4*3*6969*4
AK5*R*5
如果有超过 1 个模式A匹配,则依此类推。
编辑:我知道sed
可以做到这一点,但我仍然没有运气从每个模式 A 匹配到它第一次出现的模式 B 匹配并将它们存储在临时文本文件中以供进一步处理。
这是我的示例命令,sed
它获取example_file.txt
sed -ne '/AK2\*/,/\AK5\*R/p' example_file.txt
示例命令逻辑场景:
A="AK5\*R"
B="AK2"
find the first $A < example_file.txt; # AK5\*R
move to previous line until first occurrence of $B line; # AK2*any_number*any_number
get all lines from first $A to its first occurrence of $B and store in a text file; # result > e1.txt
# The same way goes to the second occurrence of pattern A.
(注意:$B 的第一次出现意味着,从每个 $A 行开始获取 $A 行和之前的行,直到它遇到的第一个 $B 匹配行。例如,如果第一个 $A 行从 a 的中间行开始如果文件总共有 100 行,则文件类似于第 50 行,然后从那里移动到上一行,直到命令遇到它看到的第一个 $B 行。)请参见下面的示例。
example_file2.txt
ISA*00* *00* *ZZ*SIX-SIX6 *12*666666666666 *66666666*6666*U*666666666*6666666666*0*P*\
GS*FA*SIX-SIX-SIX*666666666*6666666*6666*6666*X*66666
ST*666*666
AK1*SX*666
AK2*777*6666666
AK5*A
AK2*777*7777777
AK5*A
AK2*777*888888
AK5*A
AK2*777*7777777
AK5*A
AK2*777*5555555
AK5*A
AK2*777*7777777
AK5*A
AK2*777*4545435
AK5*A
AK2*777*7777777
AK5*A
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*A
AK2*777*0987654
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*A
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*A
输出:
AK2*777*0987654
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
我有这个file.txt.Z
包含这个:
AK2*856*1036~AK3*TD1*4**~AK4*2**1*~AK4*7**1*~AK3*TD5*5**~AK4*3**6*2~AK3*REF*6**~AK4*2**1*~AK3*REF*7**~AK4*2**1*~AK3*REF*8**~AK4*2**1*~AK3*DTM*9**~AK4*2**4*20~AK4*2**4*20~AK3*CTT*12**7~AK5*R
AK2*856*1037~AK3*HL*92**~AK4*3**7*O~AK5*R~AK9*R*2*2*0~SE*25*0001~GE*1*211582~IEA*1*000211582
每条记录都包含几个以标头(通常带有数字)开头的字段AK
,以 . 分隔~
。如果你用~
缩进的换行符替换它,它将显示为:
AK2*856*1036
AK3*TD1*4**
AK4*2**1*
AK4*7**1*
AK3*TD5*5**
AK4*3**6*2
AK3*REF*6**
AK4*2**1*
AK3*REF*7**
AK4*2**1*
AK3*REF*8**
AK4*2**1*
AK3*DTM*9**
AK4*2**4*20
AK4*2**4*20
AK3*CTT*12**7
AK5*R
AK2*856*1037
AK3*HL*92**
AK4*3**7*O
AK5*R
AK9*R*2*2*0
SE*25*0001
GE*1*211582
IEA*1*000211582
每个字段都有由 分隔的子字段*
。例如,子字段AK201
是标题之后的第一个字段AK2
,因此它856
用于示例行。
如您所见,有 2 行的起始字符串为AK2
. 这就像一个行标题,或者我们称之为段标题。中有两个段头file.txt.Z
。我想要的是按顺序从每个段标题中获取这些数据:
所需数据:
AK2
)-AK2*856*this_numeric_value
在星号或~
.之前AK3
)-~AK3*this_string_value
在*
or之前~
。AK5
)-~AK5*some_string_value*this_numeric_value
在*
or之前~
。AK4
)-~AK4*this_numeric_value
在*
or之前~
。AK4
来自或字段的每个数值AK5
都应始终至少为 2 位。例如 AK502 = 2;AK502 = 02 或 AK401 = 9;AK401 = 09。AK3
字段,则不输出任何内容。(我已经有一个脚本)AK5
字段在该字段之后丢失,请改为AK3
查找字段。AK4
AK4
没有字段,则只输出AK301(AK3头之后的第一个字段)。AK5
AK3
AK4
字段后有多个AK3
字段,请用逗号连接 AK502-AK401-sequences输出:
GS: 1036 - TD102,07 TD503 REF02 DTM02,02 CTT
GS: 1037 - HL03
这个怎么做?只要问我你是否对我的问题感到困惑。
编辑:这是我的代码:这是在一个while循环中
while read FILE
do
AK2=`zgrep -oP 'AK2.[\w\s\d]*.\K[\w\s\d]*' < $FILE`
AK3=`zgrep -oP 'AK3.\K[\w\s\d]*' < $FILE`
AK5=`zgrep -oP 'AK5.[\w\s\d]*.\K[\w\s\d]' < $FILE`
AK5_ERROR=`if [[ $AK5 =~ ^[0-9]+$ ]]; then printf "%02d" $AK5 2> /dev/null; else 2> /dev/null; fi`
AK4=`zgrep -oP 'AK4.\K[\w\s\d]*' < $FILE`
AK4_ERROR=`if [[ $AK4 =~ ^[0-9]+$ ]]; then printf "%02d" $AK4 2> /dev/null; else 2> /dev/null; fi`
if [[ $AK3 ]]
then
if $AK5 2> /dev/null
then
echo "GS: $AK2 - $AK3$AK4_ERROR"
else
echo "GS: $AK2 - $AK3$AK5_ERROR"
fi
else
echo "Errors are not specified in the file."
fi
done < file.txt.Z
我的原始代码的问题是它没有连接$AK3
and, $AK5
or $AK4
。
我有这个file.txt
包含这个列表。
LIST: ACCEPTED - rfhfui4fuw3hjnf43.4fj9u8fhjkszdnvckizfjh489.dfsdf
LIST: ACCEPTED - rfhfui4fuw3hjnf43.fj9u8fhjkszdnvckizfjh489.dfsdf
LIST: ACCEPTED - rfhfui4fuw3hjnf43.4fj9u8fhjkszdnvckizfjh489.dfsdf
LIST: ACCEPTED - rfhfui4fuw3hjnf43.4f.j9u8fhjkszdnv.ckizfjh489.dfsdf
LIST: ACCEPTED - rfhfui4fuw3hjnf.43.4fj9u8fhjkszdnvckizfjh489.dfsdf
我想要发生的是知道是否file.txt
所有的行都匹配我想要找到的模式。
例如,如果模式匹配thenACCEPTED
的所有行。file.txt
echo "All lines are Accepted"
我认为grep
有这个问题的答案,但我仍在尝试,仍然没有运气。
我想在一个if...else
条件下使用它。
我想在任何目录中对 find 命令的输出进行唯一排序,而不需要重复的文件名。
find /path/to/first_directory/* /path/to/second_directory/* /path/to/third_directory/* -mtime -1 -name "filename_pattern*"
示例输出:
/path/to/first_directory/sample_file1_2017Dec25.dat
/path/to/first_directory/sample_file2_2017Nov01.dat
/path/to/first_directory/sample_file3_2017Oct08.dat
/path/to/first_directory/archive/sample_file1_2017Dec25.dat.Z
/path/to/first_directory/archive/sample_file2_2017Nov01.dat.Z
/path/to/second_directory/sample_file4_2017Sep11.dat
/path/to/second_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file1_2017Dec25.dat
/path/to/third_directory/sample_file2_2017Nov01.dat
/path/to/third_directory/sample_file3_2017Oct08.dat
/path/to/third_directory/sample_file4_2017Sep11.dat
/path/to/third_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file6_2017July04.dat
/path/to/third_directory/sample_file6_2017June12.dat
/path/to/third_directory/sample_file7_2017May01.dat
从输出中您可以看到 and 中有重复的文件名,/first_directory/
并且/first_directory/archive/
所有文件都来自/first_directory/*
and/second_directory/*
也在 inside 中/third_directory/*
。意思就是说/third_directory/*
是和中找到的所有文件的归档目录,/first_directory/*
但/second_directory/*
也有只能在/third_directory/*
( check sample_file6
and sample_file7
)中找到的文件
我想要打印的是按此顺序从/first_directory/
到/first_directory/archive/
到/second_directory/
到的文件/third_directory/
,没有重复,并且还按日期排序。
期望的输出:
/path/to/first_directory/sample_file1_2017Dec25.dat
/path/to/first_directory/sample_file2_2017Nov01.dat
/path/to/first_directory/sample_file3_2017Oct08.dat
/path/to/second_directory/sample_file4_2017Sep11.dat
/path/to/second_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file6_2017July04.dat
/path/to/third_directory/sample_file6_2017June12.dat
/path/to/third_directory/sample_file7_2017May01.dat