我试图滥用asort()(只是因为)将数组复制src到数组dest,没有问题:
$ awk 'BEGIN {
split("first;second;third",src,";") # make src array for testing
asort(src, dest, "@ind_num_asc") # copy array to dest
for(i in dest)
print i, src[i], dest[i] # output
}'
1 first first
2 second second
3 third third
Run Code Online (Sandbox Code Playgroud)
但有没有办法使用多维数组作为dest数组?就像是:
asort(src, dest[src[1]], "@ind_num_asc") # or dest[src[1]][]
(前者产生second argument not an array,后者syntax error
实际上第一个论点split是$0,我正在尝试将记录分组.)
当然我可以使用for循环但我的大脑仍然坚持测试这个解决方案.
只是为了确定,使用 awk (至少是 Gnu awk)我真的可以转换:
从八进制到 ASCII:
print "\101" # or a="\101"
A
Run Code Online (Sandbox Code Playgroud)
从十六进制到 ASCII:
print "\x41" # or b="\x41"
B
Run Code Online (Sandbox Code Playgroud)
但从十进制到 ASCII 我必须:
$ printf "%c\n", 67 # or c=sprintf("%c", 67)
C
Run Code Online (Sandbox Code Playgroud)
print "\?67"我错过的 RTFM(备忘录)中没有秘密吗?
我正在尝试从以下位置获取字符频率$0="aabccc":
for(i=141; i<143; i++) a=a gsub("\\"i, ""); print a
213
Run Code Online (Sandbox Code Playgroud)
但使用十进制(而不是上面示例中的八进制)。十进制方法看起来非常长:
$ cat foo
aabccc
$ awk '{for(i=97;i<=99;i++){c=sprintf("%c",i);a=a gsub(c,"")} print a}' foo
213
Run Code Online (Sandbox Code Playgroud)
就用在这里了。
我正在编写一个bash脚本来自动处理一些文件,iconv如果不喜欢,我们会使用一个subjob 来重新编码源文件.为此,我使用:
enc=$(file -b --mime-encoding "$file") # get the encoding
if [ "$enc" = "iso-8859-1" ] || [ "$enc" = "us-ascii" ] # no need to encode these
then
unset enc
fi
cat "$file" | # conditional encoding below
( [[ "${enc}" ]] && iconv -f "$enc" -t iso-8859-1 || cat ) |
awk '{# code to process file further}' > "$newfile"
Run Code Online (Sandbox Code Playgroud)
问题是我有一个UTF8文件,但file错误地将其识别为ASCII.第一个非ASCII字符是字符#314206,它在第#1028行.显然有一些样本大小file,例如,如果我将文件从固定宽度转换为字符分隔,则第一个非ASCII字符是char#80872并file正确识别文件编码.所以我猜有一个样本大小介于这两个值之间.
(TL; DR)有没有办法指示file采取更大的样本或读取整个源文件,或其他一些bash友好的方式来找出编码?
我玩了file -P …
我有以下(大)文件,其中包含 30233088 个字符串:
head mystringfile.txt:
GAATGAACACGAAGAA
GAATGAACACGAAGAC
GAATGAACACGAAGAG
GAATGAACACGAAGCA
Run Code Online (Sandbox Code Playgroud)
cat sequence.txt
AAATAGAGGGCGGTCCAGGCGTGTCGAAACACTGGGTCCAGGGCAAGAGCGGTTCGGGTGTCAGGAAAGCCCCCAAGGGGGTTCGCGCGGTTTGCAGTGAGGTAGAGGCCGGTGTATGGGTAGACAATTGGGGTCCCAAAGAAAAAGGCTCGTCCAACATCATAATAAACCCAAGCACGATAAAAAGCAAACGCAGACTTCAATAGGGTACGAGCAATTGTGGCAGGGTGCTCGCTGTCAGGGTTAGATCTTCTTGGAGTCGCGTCGCTCGGGGGGGCAAGGCCAACGTAAGATCGTGGCTGATCGCTGGCAATGCGGTCGGTTGGGTGGTCGCTAGTAGGGGCACGGCGGTCTCTTATGGCGTCGTAAAATGCGTCTCCAAAGCGAAAAGGGGCGGCAGACAAGTCACCGGGCAAGCTTAGAGGTCTGGGGCCCGTGGCTTTAGGGGAATGAACACGAAGACGCGAAACGAAGTCGTGTTTCTTGTTGGCTGTAGAGGGGAAAACCGTCTGGGGCGATCTGGCGTAGTAGTGCGTGTCTTGCAGTGAGCTCCCCGTCCGTAAGGATTCGCAGGAATCCTGCGTGAAGCTCGGTCGTCTCGGCCGTGTCTCGGGGTTTGATTGCGGGTTCAGATTGGAAAGGTCTCCTCGGGTCGTTTGCTGCATTTGCTCGCAACCCTGACGTGAAAGGGGTGAGCTGTCTCCAATCTGCCACGCTGGGTGTTGCGTCGTCAGTAAAAGACTTGGTCAAGCTGGGACCTCGCAAGATCGCGAGAGGGTTAAGCACAAAAGGTATGGCGAAGCTCCCGGGTGCTCTTGTGGCCACCCAGAATCATGGTGACGTAGGTTTTGCGAAGCCATCAAAAATTCAGGCGGCAAAACGAGCCAGTAGGGTCCTGGGCAGCTGGGCTTGTAGTGGGTAGGCGGCAAAACGCAAAGAATGAACACGAAGCAACTCCGTAGTGTGACGGGGGTTCTGACAAACGTCCTGCAAGAAGTTCGTCTTGGG
Run Code Online (Sandbox Code Playgroud)
我需要grep在另一个序列文件中确定匹配的位置,我执行以下操作:
while read line; do grep -b -o $line sequence.txt >>sequence.txt.count; done<mystringfile.txt
Run Code Online (Sandbox Code Playgroud)
像这样运行代码当然需要很长时间并且只运行 1 个线程的一部分,那么我如何修改它(使用parallel或xargs?),以便它在我想要指定的尽可能多的线程上运行?
我有一个这样的列表来捕获 joomla 版本
./somedir/bla/old/libraries/cms/version/version.php
public $RELEASE = '2.5';
public $DEV_LEVEL = '24';
./somedir/bla3/www/libraries/cms/version/version.php
public $RELEASE = '2.5';
public $DEV_LEVEL = '9';
./somedir/bla4/www/libraries/cms/version/version.php
./somedir/bla5/www/w/scripts/version.php
./somedir/bla6/www/libraries/cms/version/version.php
./somedir/bla7/www/libraries/cms/version/version.php
public $RELEASE = '2.5';
public $DEV_LEVEL = '9';
Run Code Online (Sandbox Code Playgroud)
public我想要的是,如果位于下一行,则仅显示该行+接下来的两行。else 行必须被忽略
所以结果应该是:
./somedir/bla/old/libraries/cms/version/version.php
public $RELEASE = '2.5';
public $DEV_LEVEL = '24';
./somedir/bla3/www/libraries/cms/version/version.php
public $RELEASE = '2.5';
public $DEV_LEVEL = '9';
./somedir/bla7/www/libraries/cms/version/version.php
public $RELEASE = '2.5';
public $DEV_LEVEL = '9';
Run Code Online (Sandbox Code Playgroud)
我尝试过使用 awk 和这个 awk 脚本
BEGIN{ RS=""; FS="\n" }
/public/ {
for (i=1; i<=NF; i++) { …Run Code Online (Sandbox Code Playgroud) 我想打印/回显或重定向下面的行到一些文件
phone: "3434343"
name: "jack"
phone: "9876735"
name: "john"
phone: "3434343"
name: "Mack"
...multiple emptylines ...
phone: "9876735"
name: "doe"
phone: "3434343"
name: "tack"
Run Code Online (Sandbox Code Playgroud)
所需的输出线是: -
phone: "3434343" name: "jack"
phone: "9876735" name: "john"
...
Run Code Online (Sandbox Code Playgroud)
以下是我写的内容
cat /tmp/sip_summary2.log | while read LINE;
do
echo $LINE | grep '^$' > /dev/null
if [ $? -eq 0 ]
then
echo " " >> /tmp/tempsip.log
else
printf "%s " "$LINE" >> /tmp/tempsip.log
fi
done
Run Code Online (Sandbox Code Playgroud)
这有更好或更清洁的替代品吗?
我在名为Target_id_convert.txt的文件中有一个列表
70S ribosome
ALK tyrosine kinase receptor
ATP
ATP synthase
Run Code Online (Sandbox Code Playgroud)
期望的输出
('70S ribosome','ALK tyrosine kinase receptor','ATP','ATP synthase')
Run Code Online (Sandbox Code Playgroud)
我写了这段代码
sed -e "s/'/'\\\\''/g;s/\(.*\)/'\1'/" Target_id_convert.txt > Target_id_convert1.txt
tr '\n' ',' < Target_id_convert1.txt > Target_id_convert_output.txt
Run Code Online (Sandbox Code Playgroud)
然后我必须手动编辑文件并在Target_id_convert_output.txt文件中添加(),请让我知道如何有效地完成所有操作,因为它应该是自动化的.
我有一个文本文件:
192.168.47.100 computer
192.168.47.101 phone
192.168.47.1 computer3
192.168.47.50 computer2
Run Code Online (Sandbox Code Playgroud)
我想删除192.168.47.1行
我试过了
while read line
do
IPTemp="$line"
ex -s +"g/$IPTemp/d" -cwq $1
done < IPLib.txt
Run Code Online (Sandbox Code Playgroud)
但输出是:
192.168.47.50 computer 3
Run Code Online (Sandbox Code Playgroud)
我试过sed 's/192.168.47.1//g'但是再次输出是:
00 computer
01 phone
computer3
192.168.47.50 computer2
Run Code Online (Sandbox Code Playgroud)
我在谷歌搜索,但我找不到合适的.
我想使用 AWK 将文件中的十进制数字列表转换为二进制,但似乎没有内置方法。示例文件如下:
134218506
134218250
134217984
1610612736
16384
33554432
Run Code Online (Sandbox Code Playgroud) 我有大量文件(约 50000 个文件)。
ls /home/abc/def/
file1.txt
file2.txt
file3.txt
.........
.........
file50000.txt
Run Code Online (Sandbox Code Playgroud)
我想创建一个包含两列的 CSV 文件:第一列提供文件名,第二列提供绝对文件路径,如下所示:
输出.csv
file1.txt,/home/abc/def/file1.txt
file2.txt,/home/abc/def/file2.txt
file3.txt,/home/abc/def/file3.txt
.........................
.........................
file50000.txt,/home/abc/def/file50000.txt
Run Code Online (Sandbox Code Playgroud)
如何使用 bash 命令执行此操作。我尝试使用 ls 并找到
find /home/abc/def/ -type f -exec ls -ld {} \; | awk '{ print $5, $9 }' > output.csv
Run Code Online (Sandbox Code Playgroud)
但这给了我绝对路径。如何获得如上面的output.csv所示的输出