撰寫一個接收 3 個引數的 shell 腳本,但在腳本中,其中一個命令需要在應用分隔符后檢查第一個值
#!/bin/bash
awk -F'\t' '$1 ~ /$1/&&/$2/ {print $1FS$3}' $3
這個命令被稱為:
bash search.sh 5 AM filename.txt
并應執行如下:
awk -F'\t' '$1 ~ /5/&&/AM/ {print $1FS$3}' filename.txt
該命令在 shell 腳本之外正常運行,在 shell 腳本中使用它時現在不回傳任何內容。檔案名.txt :
03:00:00 AM John-James Hayward Evalyn Howell Chyna Mercado
04:00:00 AM Chyna Mercado Cleveland Hanna Katey Bean
05:00:00 AM Katey Bean Billy Jones Evalyn Howell
06:00:00 AM Evalyn Howell Saima Mcdermott Cleveland Hanna
07:00:00 AM Cleveland Hanna Abigale Rich Billy Jones
預期輸出:
05:00:00 AM Billy Jones
uj5u.com熱心網友回復:
不要在 awk 腳本中嵌入 shell 變數。
這是一個帶有一些解釋性評論的解決方案:
#!/bin/bash
[[ $# -lt 2 ]] && exit 1 ## two args required, plus files or piped/redirected input
hour="$(printf 'd' "$1")" ## add a leading zero if neccesary
pm=${2^^} ## capitalise
shift 2
time="^$hour:.* $pm\$" ## match the whole time field
awk -F '\t' -v time="$time" \
'$1 ~ time {print $1,$3}' "$@" ## if it matches, print fields 1 and 3 (date, second name)
用法是bash search.bash HOUR PM [FILE] ...,或者./search HOUR PM [FILE] ...如果您使它可執行。例如./search 5 am file.txt或./search 05 AM file.txt。
我假設每個欄位都由制表符分隔。
uj5u.com熱心網友回復:
當您單引號時,您的引數不會被 shell 擴展。您可以使用 awk 變數(如@JohnKugelman 所建議的)來更清楚地分離 shell 和 awk 代碼:
#!/bin/bash
awk -F'\t' -v p="$1" -v p2="$2" '($0 ~ p && $0 ~ p2) {print $1FS$3}' "$3"
我在這里使用通用變數名 ( pand p2) 來強調您沒有錨定您的正則運算式,因此它們確實在孔線上匹配,而不是按照預期的小時和上午/下午。
uj5u.com熱心網友回復:
這可能是你想要做的(未經測驗,使用任何 awk):
#!/usr/bin/env bash
awk -v hour="$1" -v ampm="$2" '
BEGIN {
FS = OFS = "\t"
time = sprintf("d:00:00", hour)
}
($1 == time) && ($2 == ampm) {
print $1, $3
}
' "${3:--}"
請注意,即使您的輸入檔案包含10:00:00 AM并且使用的引數是1 AM. 其他一些解決方案會失敗,因為它們使用的是部分正則運算式比較,因此 arg1將匹配、、 或 的1輸入中的s 。10:00:0011:00:0012:00:00
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/362991.html
