[英]How do I print 2 columns with looping from a file in bash
我有以下output.txt
它只包含 2 列來演示:
Test1 Test1-IS-OK
Test2 Test2-IS-NOT
Test3 Test3-IS-OK
Test4 Test4-IS-OK
Test5 Test5-IS-NOT
然后我的 bash 腳本有以下代碼:
#!/bin/bash
output="output.txt"
a=$(awk '{ print $1 }' $output)
b=$(awk '{ print $2 }' $output)
while IFS=" " read -r $a $b
do
echo "LOG: $a and $b"
done < "$output"
我收到以下錯誤:
./test.sh: line 13: read: `Test1-IS-OK': not a valid identifier
我需要有這樣的輸出
LOG: Test1 and Test1-IS-OK
LOG: Test2 and Test2-IS-NOT
LOG: Test3 and Test3-IS-OK
LOG: Test4 and Test4-IS-OK
LOG: Test5 and Test5-IS-NOT
但是代碼不起作用。 從文件中循環這 2 列的最佳方法是什么? 有沒有更簡單的方法?
最好是避免 bash 並在 awk 中完全做到這一點。 在 awk 中,它很簡單:
awk '{print "LOG:", $1, "and", $2}' file
LOG: Test1 and Test1-IS-OK
LOG: Test2 and Test2-IS-NOT
LOG: Test3 and Test3-IS-OK
LOG: Test4 and Test4-IS-OK
LOG: Test5 and Test5-IS-NOT
請考慮將awk
解析轉移到它所屬的循環:
#!/bin/bash
output="output.txt"
while read -r line
do
a=$(echo "${line}" | awk '{print $1}')
b=$(echo "${line}" | awk '{print $2}')
echo "LOG: $a and $b"
done < "$output"
根據@EdMorton 的好建議進行編輯
你的代碼有什么問題?
a=$(awk '{ print $1 }' $output)
使用echo "a=${a}"
你會看到, a 填充了所有行的輸出。 你試圖找到一些函數,在$a
之后調用。
while IFS=" " read -r $a $b
現在您正在嘗試調用“函數”a 和 b。 代碼將在讀取輸入文件之前替換變量的值。 當 a 用“Test1 Test2”填充時,代碼將嘗試填充字段$Test1
和$Test2
。
當您只想更改輸出而不將變量傳遞給另一個語句時,您可以使用awk
,或者
sed -E 's/([^ ]*) ([^ ]*).*/LOG: \1 and \2/' $output
# or
printf 'LOG: %s and %s\n' $(<$output)
你的情況,你可以read
讀書兩個參數:
while read -r a b
do
echo "LOG: $a and $b"
done < "$output"
使用這個 Perl 單行:
perl -lane 'print "LOG: $F[0] and $F[1]";' output.txt > new.txt
Perl 單行使用這些命令行標志:
-e
:告訴 Perl 查找內嵌代碼,而不是在文件中。
-n
:一次循環輸入一行,默認情況下將其分配給$_
。
-l
:在執行內聯代碼之前去除輸入行分隔符(默認情況下 *NIX 上的"\\n"
),並在打印時附加它。
-a
:在空格或-F
選項中指定的正則表達式上將$_
拆分為數組@F
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.