我正在逐行读取文件。每行看起来像这样:
xxyu: JHYU_IOPI
Run Code Online (Sandbox Code Playgroud)
每行都传递给 awk,如下所示。我想打印匹配模式的上一行;我可以用 grep 来实现这一点,并想知道我在 awk 中哪里犯了错误。
#!/bin/bash
while read i
do
awk '/$i/{print a}{a=$0}' ver_in.txt
done<in.txt
Run Code Online (Sandbox Code Playgroud)
我也尝试过这个:
#!/bin/bash
while read i
do
awk -v var="$i" '/var/{print a}{a=$0}' jil.txt
done<in.txt
Run Code Online (Sandbox Code Playgroud)
编辑:在得到建议不要使用 sh read 后使用 awk 。我的输入和期望的输出如下所示:
编辑 1:编辑@Ed Morton awk 脚本的输入,如下所示
输入文件:cat文件
/* ----------------- AIX_RUN_WATCH ----------------- */
insert_job: AIX_RUN_WATCH job_type: BOX
owner: root
permission:
date_conditions: 1
days_of_week: su
start_times: "22:00"
alarm_if_fail: 1
alarm_if_terminated: 1
group: app
send_notification: 0
notification_emailaddress:
/* ----------------- AIX_stop ----------------- */
insert_job: AIXstop job_type: CMD …
Run Code Online (Sandbox Code Playgroud) 我有一个类似下面的输入,其中有纪元和随机的第二、第三列中的数字。我正在尝试使用 awk 内置函数 strftime() 来转换纪元日期,并替换不在其中的值纪元值。
我尝试使用下面的,但没有得到我想要的输出。
awk '{ print $1 strftime("%c",$2) strftime("%c",$3) }' test.txt
Run Code Online (Sandbox Code Playgroud)
输入:-
h_RTGUSEQ_RTY_FILE_LIST_ODRF_XOB 0 0 11
TRF_RTGUSFX_RTY_FILE_LIST_XOB 0 0 11
TRF_RTGUSIG_RTY_FILE_LIST_XOB 0 0 11
NGU_AVM_DAILY_SCHEDULE_XOB 1617804000 1617804156 7
TRF_RTGUSIR_RTY_FILE_LIST_XOB 0 0 11
NGU_schedule_next 1614198958 1614198979 7
TCR_RTGUSCR_DSTGE_REPORT_XOB 1591171200 1591171268 7
YUI_RTGNLEQ_DB_CHK_RTYCYCLE_ARCHV_XOB 0 0 11
NGU_schedule_current 1614198946 1614198957 7
YUI_RTGNLEQ_Z_DUMMY_XOB 0 0 7
YUI_RTGNLEQ_Z_TRIGR_DSJ_XOB 0 0 11
YUI_RTGSGEQ_DB_CHK_RTYCYCLE_ARCHV_XOB 0 0 11
Run Code Online (Sandbox Code Playgroud)
预期输出示例格式:需要在同一文件中替换下面提到的格式中的纪元值
h_RTGUSEQ_RTY_FILE_LIST_ODRF_XOB 0 0 11
TRF_RTGUSFX_RTY_FILE_LIST_XOB 0 0 11
TRF_RTGUSIG_RTY_FILE_LIST_XOB 0 0 11
NGU_AVM_DAILY_SCHEDULE_XOB 07 …
Run Code Online (Sandbox Code Playgroud) 我尝试通过以下命令根据过滤条件提取数据awk
,但它不起作用。你能解决这个问题吗?
awk -v RS='' -v ORS='\n\n' '/func: peak*down*HIL/' filename
Run Code Online (Sandbox Code Playgroud)
输入:
func: peak_rec_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_some_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_rec_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_joy_HIL
sub: xyz
value: adc
log:path
close:date
Run Code Online (Sandbox Code Playgroud)
预期输出:
func: peak_some_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_joy_HIL
sub: xyz
value: adc
log:path
close:date
Run Code Online (Sandbox Code Playgroud) 需要在下一行之前添加空格或换行符,如果下一行以空白开头,则必须忽略。
我的输入文件如下所示
#qwert TRWQQA 01 40 /* this is the sample test */
/* STILL COMING UP... AFTER UP ENQ GOES AWAY */
/* FEB AND 30TH */
#TFCDF DWERTY 01 40 (FEB AND 30TH)
/* AND (qwert-01 01 #qwert OR */
/* (START SCD RTGFG))
XDYGH #qwert */
#HYUOIK YUPOIH 01 40 FEB AND 30TH
/* AND (qwert-01 01 #qwert OR */
/* (START SCD qwert))
SDFGH #qwert */
#NHUYUOI GHTYHD 01 40 (FEB AND 30TH) AND (qwert-01 01 …
Run Code Online (Sandbox Code Playgroud) 我的输入文件如下,其中记录用空行分隔。我需要打印行首的记录(段落)xx
。
cat in.txt
Run Code Online (Sandbox Code Playgroud)
a cfg
b hfh
c gfh
xx jhl
d kjl
a opi
b ghj
c tyu
yy xxx
d ghj
a xxx
b fgk
c ghf
z zxx
d ghj
Run Code Online (Sandbox Code Playgroud)
我的预期输出是:
a cfg
b hfh
c gfh
xx jhl
d kjl
Run Code Online (Sandbox Code Playgroud)
我尝试了下面的命令,但它不起作用:
awk -v RS='' -v ORS='\n\n' "/^XX/" in.txt
Run Code Online (Sandbox Code Playgroud)
^
在这种情况下不起作用