簡體   English   中英

如何從 bash 中的文件循環打印 2 列

[英]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

也可以看看:
perldoc perlrun : 如何執行 Perl 解釋器:命令行開關

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM