2017-09-25 194 views
1

在A.csv,有讀線,猛砸

1 
2 
3 
4 

我應該怎樣閱讀本文件並創建變量$B$C使:

echo $B 
echo $C 

回報:

1 2 3 4 
1,2,3,4 

到目前爲止,我想:

cat A.csv | while read A; 

do 

echo $A 

done 

它只返回

1 
2 
3 
4 
+0

這裏有什麼「將一個while循環傳入變量」? –

回答

1

正如@Cyrus說

B=$(cat A.csv) 
echo $B 

將輸出:

1 2 3 4 

因爲bash將不攜帶換行符如果變量不裹報價。如果A.csv包含任何可能受bash glob擴展影響的字符,這很危險,但如果您只是閱讀簡單的字符串,應該沒問題。

如果你正在讀簡單的字符串與任何元素沒有空格,你還可以通過使用得到$ C你期望的結果:

echo $B | tr ' ' ',' 

這將輸出:

1,2,3,4 

如果A.csv中的行可能包含bash特殊字符或空格,則我們返回到循環。

爲什麼我格式化文件讀取循環,因爲我有,請參閱:Looping through the content of a file in Bash?

B='' 
C='' 
while read -u 7 curr_line; do 
    if [ "$B$C" == "" ]; then 
    B="$curr_line" 
    C="$curr_line" 
    else 
    B="$B $curr_line" 
    C="$C,$curr_line" 
    fi 
done 7<A.csv 

echo "$B" 
echo "$C" 

將建設兩個變量,你的願望使用遍歷文件內容,並應防止防止意外通配和分裂。

1
B=$(cat A.csv) 
echo $B 

輸出:

 
1 2 3 4 

,隨着行情:

echo "$B" 

輸出:

 
1 
2 
3 
4 
+0

適用於OP的當前輸入,但是如果其文件中的某一行有*號(或帶有空格的行),我預計它們的輸出可能會令人驚訝。 –

+0

@CharlesDuffy:你可能是對的。 – Cyrus

0

試試這個:

cat A.csv | while read A; 

do 

printf "$A" 

done 

商祺!

+1

Eh?在這種用法中不會有任何換行符,並且如果它包含格式轉義符,它也會打亂您的輸出。也許你想要'printf'%s'「$ A」',在每個之後打印一個空格,然後在'printf'\ n'後面打印? –

+0

而'cat'只不過是開銷而已 - 在'done'之後使用'

2

假設bash 4。X,下面是有效的,強大的,和本地:

# Read each line of A.csv into a separate element of the array lines 
readarray -t lines <A.csv 

# Generate a string B with a comma after each item in the array 
printf -v B '%s,' "${lines[@]}" 

# Prune the last comma from that string 
B=${B%,} 

# Generate a string C with a space after each item in the array 
printf -v B '%s ' "${lines[@]}" 
1

我將文件讀入到一個bash數組:

mapfile -t array < A.csv 

然後,用不同的聯接字符

b="${array[*]}"  # space is the default 
echo "$b" 

c=$(IFS=","; echo "${array[*]}") 
echo "$c" 

或者,您可以使用paste加入指定分隔符的所有行:

b=$(paste -d" " -s < A.csv) 
c=$(paste -d"," -s < A.csv) 
+0

'mapfile'和'readarray'是同義詞,只能在版本> 4.0中使用,'paste'解決方案整齊且兼容3.x! –

0

試試這個(較簡單的):

b=$(tr '\n' ' ' < file) 
c=$(tr '\n' ',' < file) 

您不必讀取文件爲。確保你運行了dos2unix file命令。如果您正在窗口中運行(要刪除\r)。

說明:它會修改文件。所以,請確保您從原始文件複製。