我有一个名为names.txt的文件,如下所示:
foreach ($cards as $card) {
$choices["{$card->brand} **** **** **** {$card->last4}"] = $card->id;
}
$form = $this->createFormBuilder()
->add('card', ChoiceType::class, ['choices' => $choices,'expanded' => true, 'multiple' => false])
->add('Submit', SubmitType::class)
->getForm()
我想使它最终像:
0,james,hard,fun,circle
1,caron,hard,agin,square
我想运行一个脚本,询问该文件,然后使用$ 1自变量对这些文件进行更改并剪切。
我知道这是一个棘手的问题,可能涉及很多代码,因此,我非常感谢你们的帮助。
注意:我的文件包含9999个输入,并且第一个输入为0,因此总共有10,000个输入。
答案 0 :(得分:1)
这是一个完整的文件,它将按照您要求的方式修改文件并将其写入终端,特别是标准输出,这是被写入终端的“渠道”之一默认情况下。 (渠道不是一个技术术语)。
#!/bin/bash
awk -F, -vOFS=, '{print $0,"c" $1 }' "$1" | cut -d, -f2-
如果数据中包含空白行,我们可以通过在awk
片段中添加一个检查来跳过它们。
#!/bin/bash
awk -F, -vOFS=, 'NF > 0 {print $0,"c" $1 }' "$1" | cut -d, -f2-
如果文件名为rotate.sh
,而您的数据为whatever.csv
,则可以按以下方式调用
bash rotate.sh whatever.csv
这会将修改后的文件打印到您的终端。如果要将其保存在某处,请编写此代码。
bash rotate.sh whatever.csv > /tmp/a.csv
不要写以下内容
bash rotate.sh whatever.csv > whatever.csv
上面的脚本无法修改正在读取的文件。
@lurker提供的示例sed
脚本将在Linux上运行。如果直接在命令行中键入此内容,它将在适当位置修改文件。
sed -i "s/^\([0-9]*\),\(.*\)$/\2,c\1/" whatever.csv
该命令的OS X等效版本是
sed -i '' "s/^\([0-9]*\),\(.*\)$/\2,c\1/" whatever.csv
答案 1 :(得分:1)
这是一种使用剪切和粘贴的方法:
$ paste -d, <( cut -d, -f2- names.txt ) <( cut -d, -f1 names.txt | sed 's/^/c/' )
james,hard,fun,circle,c0
caron,hard,agin,square,c1
当然,您可以将$ names.txt替换为$ 1,将其转换为脚本,如下所示:
#!/bin/bash
paste -d, <( cut -d, -f2- $1 ) <( cut -d, -f1 $1 | sed 's/^/c/' )
或者如果您确实要提示用户:
#!/bin/bash
echo -n "Please specify a file to rearrange:"
read filename
paste -d, <( cut -d, -f2- $filename ) <( cut -d, -f1 $filename | sed 's/^/c/' )
如果要验证用户输入的文件是否有效:
#!/bin/bash
echo -n "Please specify a file to rearrange:"
read filename
if [ -r "$filename" ] ; then # is the file readable?
paste -d, <( cut -d, -f2- $filename ) <( cut -d, -f1 $filename | sed 's/^/c/' )
else
echo "'$filename' is not readable." >&2 # let them know its bad via stderr
fi