我有一個像這樣的字串:dog cat bird whale
我想得到dog dog cat cat bird bird whale whale
所有的字都在同一行。任何想法?
答案1
新增至解決方案系列:-)。
duplicator.sh
:
for i; do echo -n "$i $i "; done; echo
使其可執行,現在:
$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale
或作為 shell 函數,例如可以在腳本中重複使用:
duplicator() {
for i; do echo -n "$i $i "; done; echo
}
然後可以直接運行,定義為
duplicator dog cat bird whale
答案2
你可以使用sed
:
sed -r 's/(\S+)/\1 \1/g' filename
如果您想就地儲存文件的更改,請說:
sed -i -r 's/(\S+)/\1 \1/g' filename
您也可以使用perl
:
perl -M5.10.0 -ne 'say join " ", map{$_, $_} split " ";' filename
(新增將-i
變更儲存到文件中的選項。)
或者,按照建議特登:
perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;' filename
引用自perlvar
:
@F
此陣列
@F
包含開啟自動分割模式時讀取的每一行的欄位。有關開關,請參閱 perlrun-a
。該數組是特定於包的,如果在strict 'vars'
.
答案3
如果沒有答案,這會是什麼awk/gawk
:
$ awk '{ for(i=1;i<=NF+1;i+=1/2) { printf("%s ",$i); }}' <<<"dog cat bird whale"
dog dog cat cat bird bird whale whale
如果終止換行符號很重要:
$ awk '{ for(i=1;i<=NF+1;i+=1/2) { printf("%s ",$i); }} END{print ""}' <<<"dog cat bird whale"
答案4
如果您的字串位於 a 變數中,例如foo="dog cat bird whale"
,您可以這樣做:
純bash:
$ echo "$foo" | (read a b c d && echo "$a $a $b $b $c $c $d $d") dog dog cat cat bird bird whale whale
解釋:需要括號,以便
read
和echo
發生在同一個子 shell 中,因此可以共享變數。沒有它們,echo
只會列印一個空白行。核心工具:
$ join -j 5 -o 1.1,1.1,1.2,1.2,1.3,1.3,1.4,1.4 <(echo $foo) <(echo) dog dog cat cat bird bird whale whale
解釋:
-o
的標誌可讓join
您設定輸出格式。在這裡,我告訴它要列印第一個檔案的第一個欄位 (1.1
),然後列印第一個檔案的第二個欄位 (1.2
) 等。然而,join
旨在加入二公共欄位上的輸入行。所以,我也給它傳遞了一個空白行(<(echo)
),然後忽略它。設定-j
連接字段,將其設為不存在的字段(第五個)會導致join
列印整行。如果您不關心空格或輸入順序,您可以這樣做
$ paste <(echo $foo) <(echo $foo) dog cat bird wale dog cat bird wale
珀爾1:
$ echo $foo | perl -lane 'push @k, $_,$_ for @F; print "@k"' dog dog cat cat bird bird whale whale
解釋:
-l: adds a newline to each print call (among other things) -a: turns on field splitting, fields are saved as @F -n: process input line by line -e: give a script as a command line parameter.
上面的腳本將
@F
在數組中保存每個字段(來自 )兩次@k
,然後列印@k
。如果您不需要尾隨換行符,您可以簡化為$ echo $foo | perl -ane 'print " $_ $_" for @F'
珀爾2:
$ echo $foo | perl -0040 -pne 'print "$_"' | paste - - dog dog cat cat bird bird whale whale
解釋:此
-0
選項設定輸入記錄分隔符號(作為十六進位或八進制數,請參閱這裡用於轉換)。在這裡,我將其設為八進制,040
即一個空格。使列印每個輸入“行”,並且由於我們已將記錄分隔符號設為空格,-p
所以perl
行現在由空格定義,因此每個欄位都會列印兩次。awk
:$ echo $foo | awk '{for(i=1;i<=NF;i++){$i=$i" "$i;} 1;}' dog dog cat cat bird bird whale whale
解釋:
NF
是字段的數量,因此上面的腳本會遍歷每個字段並將其附加到自身。完成後,我們列印該行(1;
只是 print 的簡寫)。